Есть ли разница между '&&' и ';' символов в стандартном BASH-терминале?

52

Кажется, они оба сигнализируют BASH, чтобы начать с другой команды, следующей за символами, но есть ли разница?

    
задан Michael Terry 27.01.2011 в 18:01
источник

6 ответов

66

С помощью этой строки:

command1 && command2

command2 будет выполняться, если (и только если) command1 возвращает статус завершения, но в этой строке:

command1 ; command2

как command1, так и command2 будут выполняться независимо. Точка с запятой позволяет вводить много команд в одной строке.

    
ответ дан user8290 27.01.2011 в 18:12
источник
40

Вы можете попробовать разницу для себя:

  1. ls /invalid/path && echo "hello!"
    поскольку / invalid / path не существует, ls не может показать вам список каталогов. Он выйдет из строя с сообщением об ошибке: «ls: / invalid / path: Нет такого файла или каталога».
    вторая половина команды (echo "hello!") никогда не выполняется , потому что первая половина не удалась.

  2. ls /invalid/path ; echo "hello!"
    Такое же сообщение об ошибке появляется, как и раньше, но на этот раз выполняется вторая часть !
    ls: / invalid / path: Нет такого файла или каталога
    Привет!

Почему это полезно?
Предположим, вы хотите извлечь файл с именем archive.tar.gz
Вы можете использовать команду tar zxvf archive.tar.gz && rm archive.tar.gz .
Если по какой-либо причине извлечение архива не выполняется, вторая часть не выполняется! Вы можете попробовать еще раз.

Если вы используете; в той же ситуации архив удаляется, и вы не можете повторить попытку.

    
ответ дан Kenny Rasschaert 27.01.2011 в 18:37
8

&& AND , что означает, что вторая команда будет выполняться только в том случае, если первая вернулась (без ошибок).

    
ответ дан Ward Muylaert 27.01.2011 в 18:11
6

Обновление . Я добавил в качестве сценария для просмотра некоторых возможных ловушек:

Поскольку никто не упомянул «||», я буду

Update2 : некоторые важные переформулировки здесь
& Amp; & Amp; как «then» выражения «if», которое отвечает «true»

|| НЕ , как «else» в статусе «если».
|| как «то» выражения «if», которое реагирует на «ложные»

Более конкретно, & amp; & amp; тестирует $? возвращаемое значение предыдущего самого последнего выполненного оператора и передает управление оператору или подклассу сразу после & amp; & amp; ... он передает только управление, если $? правда.

|| аналогичен, и его часто видно после & amp; & amp; , но он проверяет возвращаемое значение false ($?) из <предыдущей самой последней версии . NB! , Нота Бене! Заметьте, хорошо! .... если инструкция preecing является & amp; & amp; оператор, который возвращает false, когда вы ожидаете, что он будет истинным, тогда || будет реагировать на ложь, поэтому смешивание в одной строке может быть рискованным

Основная мысль, которую я пытаюсь сделать, связана с ошибкой, которую я сделал. а именно:
 ## [[условие]] & amp; & amp; & amp; A || B
не не ведет себя как тройной стиль C / C ++. а именно:
// (состояние) ? A: B
См. Сценарий ниже для примеров «неожиданных» результатов от «A»

Основной тест и & amp; & amp; и || оператор должен быть в одной строке ...

Запустите этот скрипт, чтобы увидеть, где все может пойти не так, когда вы используете & amp; & amp; & amp; и || Оператор недавно выполненный не может быть тем, который вы ожидаете.

[[условие]] & amp; & amp; & amp; & amp; echo Hello || echo Goodbye .... обычно безопасно,
потому что хорошо сформированное эхо вернет true.
но как насчет доступа к файлу, который не выходит?

#!/bin/bash
#
# "as expected" return codes" means: expected to behave like a normal AND / OR  contition test
#
if [[ "$1" != "" ]] ; then exit $1; fi # recursive call to return an arbitary $? value (decimal)
echo
echo 'test 1: All return codes are "as expected"'
echo  ======
 ((1==1)) && echo  " ((1==1)) rc=$? ..&&.. condition is true" || echo  " ((1==1)) rc=$? ..||.. condition is false"
  $0  0   && echo "  \%pr_e%  0   rc=$? ..&&.. condition is true" || echo "  \%pr_e%  0   rc=$? ..||.. condition is false"
 ((1!=1)) && echo  " ((1!=1)) rc=$? ..&&.. condition is true" || echo  " ((1!=1)) rc=$? ..||.. condition is false"
  $0  1   && echo "  \%pr_e%  1   rc=$? ..&&.. condition is true" || echo "  \%pr_e%  1   rc=$? ..||.. condition is false"
echo
echo 'test 2: Now throw in some "unexpected" errors into the first of the &&/|| pair' 
echo  ======
 ((1==1)) && (echo  " ((1==1)) rc=$? ..&&.. condition is true"; $0 1)  || echo  " ((1==1)) rc=$? ..||.. condition is false"
  $0  0   && (echo "  \%pr_e%  0   rc=$? ..&&.. condition is true"; $0 2)  || echo "  \%pr_e%  0   rc=$? ..||.. condition is false"
 ((1!=1)) && (echo  " ((1!=1)) rc=$? ..&&.. condition is true"; $0 3)  || echo  " ((1!=1)) rc=$? ..||.. condition is false"
  $0  1   && (echo "  \%pr_e%  1   rc=$? ..&&.. condition is true"; $0 4)  || echo "  \%pr_e%  1   rc=$? ..||.. condition is false"
echo
echo 'test 3: Now swap the order of && and || statements, using "as expected" return codes'
echo  ======
 ((1==1)) || echo  " ((1==1)) rc=$? ..||.. condition is true" && echo  " ((1==1)) rc=$? ..&&.. condition is false"
  $0  0   || echo "  \%pr_e%  0   rc=$? ..||.. condition is true" && echo "  \%pr_e%  0   rc=$? ..&&.. condition is false"
 ((1!=1)) || echo  " ((1!=1)) rc=$? ..||.. condition is true" && echo  " ((1!=1)) rc=$? ..&&.. condition is false"
  $0  1   || echo "  \%pr_e%  1   rc=$? ..||.. condition is true" && echo "  \%pr_e%  1   rc=$? ..&&.. condition is false"
echo
echo 'test 4: With the order of && and || statements still swapped, introduce "unexpected" errors into the first of the &&/|| pair' 
echo  ======
 ((1==1)) && (echo  " ((1==1)) rc=$? ..&&.. condition is true"; $0 1)  || echo  " ((1==1)) rc=$? ..||.. condition is false"
  $0  0   && (echo "  \%pr_e%  0   rc=$? ..&&.. condition is true"; $0 2)  || echo "  \%pr_e%  0   rc=$? ..||.. condition is false"
 ((1!=1)) && (echo  " ((1!=1)) rc=$? ..&&.. condition is true"; $0 3)  || echo  " ((1!=1)) rc=$? ..||.. condition is false"
  $0  1   && (echo "  \%pr_e%  1   rc=$? ..&&.. condition is true"; $0 4)  || echo "  \%pr_e%  1   rc=$? ..||.. condition is false"

exit 
ответ дан Peter.O 09.02.2011 в 07:42
1

попробовать

false && echo "hello"

и

false ; echo "hello"

см. разницу

    
ответ дан Petrie Wong 09.02.2011 в 07:19
0

Команда (функция, в случае скрипта) после && выполняется в зависимости от RETVAL первой команды (функция, в случае скрипта). Это приводит к тому, что первая команда вернет значение 0, если оно будет успешным. Мы можем проверить возвращаемое значение для выполнения дальнейших команд.

    
ответ дан theTuxRacer 09.02.2011 в 09:07