Причина в том, что newgrp
по существу просто создает новый экземпляр bash, и в результате, пока он не завершится, (никогда не происходит ), он не может продолжить выполнение скрипта. По существу так же, как если бы у вас было su - $(id -u -n);
в вашем скрипте
Здесь есть пара проблем. Во-первых, вы заключаете $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», как в некоторых версиях ), не рассматриваются как часть имени переменной.)