Назначить команду тайм-аута переменной в скрипте

Причина в том, что newgrpпо существу просто создает новый экземпляр bash, и в результате, пока он не завершится, (никогда не происходит ), он не может продолжить выполнение скрипта. По существу так же, как если бы у вас было su - $(id -u -n);в вашем скрипте

1
15.12.2020, 23:00
1 ответ

Здесь есть пара проблем. Во-первых, вы заключаете $tв двойные -кавычки:

"$t" nvlc stream-url

Двойное -заключение ссылок на переменные в кавычки почти всегда является хорошей идеей, так как это предотвращает неожиданное разбиение слов и/или раскрытие подстановочных знаков, но в этом случае вам необходимо разбиение слов . Если для tустановлено значение timeout 5s, двойные кавычки заставляют оболочку рассматривать всю строку как имя команды, а не разбивать ее наtimeout(имя команды )и5s(аргумент для нее ). ]. Кроме того, если для tзадана пустая строка, она не просто исчезает из команды, а фактически пытается запустить пустую строку в качестве имени команды! Чтобы решить эту проблему, просто удалите двойные -кавычки:

$t nvlc stream-url

(Если бы команда была более сложной, вам, возможно, пришлось бы использовать массив вместо простой переменной; см. BashFAQ #50 :Я пытаюсь поместить команду в переменную, но сложные случаи всегда терпят неудачу!)

Вторая проблема связана с условным выражением [ -z ${duration+x} -o $duration = 0 ]. Поскольку ссылки на переменную durationявляются не двойными -цитируемыми здесь, они действительно исчезают, если durationустановлено на пустую строку, поэтому все это будет расширяться на [ -z x -o = 0 ], что недопустимо. Здесь вам нужно дважды -цитировать их. А также либо удалите +xиз первого теста, либо замените его на :+x--, опция +xрасширяет его до «x», если переменная вообще установлена ​​(, даже если она установлена ​​​​на пустую строку. ), но так как это было просто read, оно будет всегда расширяться до "x". Просто удалите +xи добавьте правильные двойные -кавычки:

if [ -z "${duration}" -o "$duration" = 0 ]; then...

Наконец,цитата в t='timeout '"$duration"'m'странная. Не совсем неправильно, просто слишком сложно. Одиночное -цитирование разделов переменных, отличных от -, является излишним, а одиночное -цитирование всего этого предотвратит раскрытие переменной. Было бы проще и понятнее просто дважды -цитировать все целиком:

t="timeout ${duration}m"

(Обратите внимание, что фигурные скобки необходимы, поэтому «m» (или «s», как в некоторых версиях ), не рассматриваются как часть имени переменной.)

3
18.03.2021, 22:43

Теги

Похожие вопросы