Каково различие между | и ||?
Когда я выполняю эту команду:
ls -la | id
Я получаю результат id
Когда я выполняю эту команду:
ls -la || id
Я получаю результат ls -la
Таким образом, каково различие между ними?
|
оператор канала, который передает вывод первой команды к той, которая следует.
от man bash
:
Конвейер является последовательностью одной или нескольких команд, разделенных символом |. Формат для конвейера:
[time [-p]] [ ! ] command [ | command2 ... ]
Стандартный вывод команды подключен через канал к стандартному входу command2.
В примере Вы обеспечиваете, id
кажется, ничего не делает с выводом ls
таким образом, это просто возвращает тот же вывод как выполнение id
один.
||
логическая операция ИЛИ и указывает, что сделать, если первая команда возвращается false
или сбои (является ненулевым).
от man bash
:
Операторы управления && и || обозначают И списки и ИЛИ списки, соответственно. И список имеет форму
command1 && command2
command2 выполняется, если, и только если, command1 возвращает статус выхода нуля.
ИЛИ список имеет форму
command1 || command2
command2 выполняется, если и только если command1 возвращает ненулевой статус выхода. Статус возврата И и ИЛИ списки является статусом выхода последней команды, выполняемой в списке.
В Вашем примере, ls -la
выполнения успешно так id
команда не выполняется. Если Вы сделали следующее:
ls -z || id
и попытайтесь передать недопустимую опцию z
кому: ls
, затем это перестало работать и id
команда выполняется.
|
оператор канала. От этого man sh
:
Конвейер является последовательностью одной или нескольких команд, разделенных |. Стандартный вывод каждой команды, но последнего соединен каналом (2) к стандартному входу следующей команды. Каждая команда выполняется как отдельный процесс; оболочка ожидает последней команды для завершения. Значение конвейера является статусом выхода своей последней команды.
A | B | C
Возьмет стандартный вывод (что он печатает на экран), и дайте его B как стандартный вход, как то, что Вы ввели бы в интерактивном режиме, и B дает свой stdout C.
history | grep word
history
печать вся история Вашей оболочки, и grep
строки печати, соответствующие шаблону, таким образом, это находит каждую запись в Вашей истории оболочки, где Вы использовали word
, потому что grep
STDIN чтений при отсутствии предоставления имени файла как аргумент.
history | tail -n10 | head -n5
Получает первые 5 строк последних 10 строк history
, потому что tail
и head
оба читает STDIN, когда никакое имя файла не дано.
С другой стороны, ||
логическая операция ИЛИ, точно эквивалентная тому же оператору в C и подобная языкам C. Снова, от этого man sh
:
Символы && и ||, соответственно, вызывают список после быть выполненными, только если предыдущий конвейер возвращает нуль или не нулевое значение, соответственно. Новые строки, может казаться, в списке, вместо точек с запятой, разграничивают команды.
stat filename || echo "no such file or directory"
stat filename && echo "file exists"
Если stat
не находит имя файла, оно возвращает ненулевой статус выхода, и если оно делает, оно выходит успешно с 0. Это - инверсия C. (Высоко изобретенные примеры как stat
дает такую информацию так или иначе.)
Это по существу то же как, но короче, чем, проверяя статус выхода последней команды явно:
stat filename
if [ $? -gt 0 ]; then
echo "no such file or directory"
fi
и т.д.