Разница между "echo" hello "; ls" vs "echo" hello "&& ls"?

Интересно, какая разница между

"echo 'hello'; ls"

и

"echo 'hello' && ls"

это? они оба делают то же самое

Ответы

Ответ 1

"echo 'hello' && ls" означает: выполнить "ls", если "echo" hello "запускается успешно. Чтобы понять, что" успешно" в bash. Попробуйте следующее:

bash > cd/
bash > echo $?

если предыдущая команда выполняется успешно, вы должны увидеть 0

После этого попробуйте следующее:

bash > asdfdf
bash > echo $?

Вы должны увидеть ненулевое значение между 1 и 255. Это означает, что предыдущая команда не была успешно выполнена

С другой стороны, "echo" hello "; ls" означает выполнение "ls", успешно ли выполняется "echo" hello ".

Ответ 2

&& - логический оператор И. Идея в ее использовании в command1 && command2 заключается в том, что команда2 только оценивается/запускается, если команда1 была успешной. Итак, здесь ls будет запущен, только если команда echo вернулась успешно (что всегда будет иметь место здесь, но вы никогда не знаете;-). Вы также можете написать это как:

if echo 'hello'
then
  ls
fi

Точка с запятой просто ограничивает две команды. Поэтому вы также можете написать echo 'hello' ; ls как:

echo 'hello'
ls

Таким образом, ls также будет выполняться даже в случае неудачи echo.

BTW, успешный в этом контексте означает, что программа была выведена с чем-то вроде exit(0) и, таким образом, возвращается 0 в качестве кода возврата (переменная оболочки $? сообщает вам статус возврата последней выполненной команды).

Ответ 3

Чтобы добавить ответ DarkDust:

Итак, здесь ls будет запущен, только если команда echo вернется успешно (что всегда будет иметь место здесь, но вы никогда не знаете; -).

Ну, не всегда. Например, стандартный выходной поток может быть неприемлемым

:; ( echo "foo" && touch /tmp/succeeded) >/dev/full
bash: echo: write error: No space left on device
:; ls -l /tmp/succeeded
ls: cannot access /tmp/succeeded: No such file or directory

Ответ 4

Здесь они делают то же самое.

Но возьмем другой пример:

cp file target && ls
cp file target; ls

В первом случае ls будет выполняться только в том случае, если cp завершается успешно. Во втором случае, независимо от того, выполняется ли cp или не удается, ls всегда будет выполняться.