Разница между "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
всегда будет выполняться.