Интересное поведение команды echo -n при использовании в начале - PullRequest
1 голос
/ 10 марта 2020

Я вижу одно интересное поведение с некоторыми командами, которые требуют прерывания вручную при передаче по каналу с помощью команды echo -n.

bash-3.2$ openssl
OpenSSL> exit

bash-3.2$ echo -n | openssl
OpenSSL> bash-3.2$

bash-3.2$ telnet 10.207.139.8 22
Trying 10.207.139.8...
Connected to 10.207.139.8.
Escape character is '^]'.
SSH-2.0-OpenSSH_7.4
^]
telnet> Connection closed.

bash-3.2$ echo -n | telnet 10.207.139.8 22
Trying 10.207.139.8...
Connected to 10.207.139.8.
Escape character is '^]'.
Connection closed by foreign host.
bash-3.2$

При использовании с echo -n он не будет запрашивать ввод данных пользователем. Что происходит за кулисами?

Страница руководства команды echo гласит:

 -n    Do not print the trailing newline character.  This may also be achieved by appending `\c' to the end of the string, as is done by iBCS2
           compatible systems.  Note that this option as well as the effect of `\c' are implementation-defined in IEEE Std 1003.1-2001 (``POSIX.1'')
           as amended by Cor. 1-2002.  Applications aiming for maximum portability are strongly encouraged to use printf(1) to suppress the newline
           character.

1 Ответ

3 голосов
/ 10 марта 2020

Когда вы соединяете две команды в конвейер, foo | bar, выходные данные первой команды передаются как входные данные для второй команды.

В отличие от этого, когда вы просто запускаете вторую команду на ее собственный, bar, его входные данные наследуются от среды. В вашем случае это означает, что ввод поступает от того, что вы печатаете на консоли.

Итак, это:

openssl

запускает openssl и позволяет вводить ввод для него, тогда как это:

echo -n | openssl

запускает openssl с абсолютно пустым вводом - поэтому он сразу видит конец файла и завершается.

(Во многих случаях это все еще возможно для программы для доступа к консоли и непосредственного взаимодействия с вами. Но обычно Unix -y программы предназначены для того, чтобы не навязывать себя таким образом. Если вы перенаправляете стандартный ввод откуда-то еще, большинство Unix -y программ будет уважать это.)

Кстати, более обычным способом передачи пустого ввода в команду является использование специального всегда пустого файла /dev/null:

openssl </dev/null
...