Когда вы соединяете две команды в конвейер, foo | bar
, выходные данные первой команды передаются как входные данные для второй команды.
В отличие от этого, когда вы просто запускаете вторую команду на ее собственный, bar
, его входные данные наследуются от среды. В вашем случае это означает, что ввод поступает от того, что вы печатаете на консоли.
Итак, это:
openssl
запускает openssl
и позволяет вводить ввод для него, тогда как это:
echo -n | openssl
запускает openssl
с абсолютно пустым вводом - поэтому он сразу видит конец файла и завершается.
(Во многих случаях это все еще возможно для программы для доступа к консоли и непосредственного взаимодействия с вами. Но обычно Unix -y программы предназначены для того, чтобы не навязывать себя таким образом. Если вы перенаправляете стандартный ввод откуда-то еще, большинство Unix -y программ будет уважать это.)
Кстати, более обычным способом передачи пустого ввода в команду является использование специального всегда пустого файла /dev/null
:
openssl </dev/null