Что является различием между использованием; и выполнение сценария

Начальная загрузка к однопользовательскому режиму путем добавления '1' (без кавычек) к командной строке ядра GRUB, поместите в черный список nouveau и перезагрузку.

7
02.04.2014, 17:04
3 ответа

Да, есть большой разница. && - это короткое замыкание , поэтому последующая команда будет выполняться только в том случае, если предыдущая вернулась с кодом выхода 0 .

Цитата из руководства :

выражение1 && выражение2

 Истинно, если и выражение1, и выражение2 истинны. 
 

С другой стороны. , сценарий, содержащий

expression1
expression2

, выполнит второе выражение, даже если первое не удастся. (Если вы не указали сценарий для выхода при ошибке, указав set -e .)


РЕДАКТИРОВАТЬ: Относительно вашего комментария, совпадает ли:

command1; command2

с:

command1
command2

Ответ обычно .Bash анализирует весь блок операторов, прежде чем оценивать его. А; не вызывает оценку предыдущей команды. Если бы предыдущая команда повлияла на то, как будет анализироваться следующая, то вы заметили бы разницу.

Рассмотрим файл, содержащий псевдонимы, назовем его псевдонимом с записью:

alias f="echo foo"

Теперь рассмотрим сценарий, содержащий:

shopt -s expand_aliases
source ./alias
f

и еще один, содержащий:

shopt -s expand_aliases; source ./alias; f

, тогда вы можете подумать, что оба даст такой же результат.

Ответ - НЕТ. Первый будет выдавать foo , но второй сообщит:

... f: command not found

Чтобы уточнить, проблема не в expand_aliases . Проблема возникает из-за того, что утверждение типа:

alias f="echo foo"; f

будет проанализировано за один раз. Оболочка на самом деле не знает, что такое f , это заставляет синтаксический анализатор подавляться.

17
27.01.2020, 20:13

Еще одно отличие от упомянутого заключается в том, что ваш сценарий оболочки выполняется в отдельной оболочке, поэтому любые изменения в среде не распространяются. Например, если вы введете свою интерактивную оболочку

test -f foo && file=foo || file=other

, тогда ваша интерактивная оболочка будет содержать переменную file (которую вы можете прочитать с помощью $ file ), содержащую foo ], если файл foo существует и является обычным файлом, и other в противном случае. Теперь, если вы поместите то же самое в сценарий оболочки и вызовете его из интерактивной оболочки, тогда переменная file в вашей интерактивной оболочке не будет установлена ​​(но, конечно, внутри вашего сценария оболочки она будет установлена, поэтому вы можете использовать его в дальнейших командах).

2
27.01.2020, 20:13

Да, && - это условие. Задняя команда будет запущена только в том случае, если предыдущая вернет 0 (завершится без ошибки). С другой стороны, ваш скрипт не имеет этого элемента управления, поэтому, если, например, wget завершается ошибкой, он продолжит попытку разархивировать и ничего не переместить ..

Онлайнер для вашего скрипта:

wget http://something.com ; unzip something ; mv -f something /home/poney/
6
27.01.2020, 20:13

Теги

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