Различие между | и ||

Каково различие между | и ||?

Когда я выполняю эту команду:

ls -la | id

Я получаю результат id

Когда я выполняю эту команду:

ls -la || id

Я получаю результат ls -la

Таким образом, каково различие между ними?

6
задан 13 July 2016 в 22:36

2 ответа

| оператор канала, который передает вывод первой команды к той, которая следует.

от 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 команда выполняется.

19
ответ дан 23 November 2019 в 07:15

| оператор канала. От этого 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

и т.д.

6
ответ дан 23 November 2019 в 07:15

Другие вопросы по тегам:

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