пример консольного вывода, который не записан в стандартный вывод

Это кажется read не пишет в стандартный вывод.

$ cat test.sh
#!/bin/bash
read -p "type a key and Enter" key
echo "the key was $key"
$ ./test.sh
type a key and Enterx
the key was x
$ ./test.sh | tee file
type a key and Enterx
the key was x
$ cat file
the key was x

Попытка его без сценария...

$ read -p "type a key and Enter" key | tee file
type a key and Enterx
$ cat file
$ 

read команда описана здесь. Краткое описание: "Считайте строку из стандартного входа".

Информация о канале, |, из Командной строки Linux (2-й интернет-Выпуск) William E. Shotts следует.

Используя оператор канала "|" (вертикальная панель), стандартный вывод одной команды может быть передан по каналу к в стандартный вход другого: command1 | command2

Из страницы справочника для tee это описание:

читайте из стандартного входа и запишите в стандартный вывод и файлы

Страница справочника для tee в этой ссылке.

Где список всех других примеров программ, которые пишут в консоль, но на самом деле не используют стандартный вывод, или в отсутствие такого списка, каково общее правило для знания, когда программа, которая пишет в консоль, не использует стандартный вывод?

Это кажется read нарушает Принцип Наименьшего количества Удивления.

3
задан 7 January 2017 в 07:02

2 ответа

В Вашем примере, read пишет в stderr вместо stdout. Вот то, как я знаю:

$ read -p "Type a key and press Enter: " key >/dev/null
Type a key and press Enter: x
$ read -p "Type a key and press Enter: " key 2>/dev/null
x

можно сделать этот тест на любой программе, чья производит Вас, хотят перенаправить.

, Таким образом, команда, которую Вы ищете, является этим:

$ read -p "Type a key and press Enter: " key 2>&1 | tee file
Type a key and press Enter: x
$ cat file
Type a key and press Enter: $

Для объяснений вышеупомянутых перенаправлений:

6
ответ дан 1 December 2019 в 13:23

С какой сказанный wjandrea, который корректен, который можно захватить stderr то чтение делает. К сожалению, пытаясь читать в с stderr не сохраняет переменную key, так вывод для echo $key закончится пробел. Однако в сценарии это сохранит переменную, потому что сама строка чтения не перенаправляется от stderr кому: stdout 2>&1 в сценарии. Вместо этого сценарий добирается для хранения переменной, потому что это теперь установлено, прежде чем это доберется до перенаправления. Я думаю, чтобы помочь, использовать echo строки вместо этого. Я добавил все примеры.

Пример Вашего сценария:

:~$ cat test1.sh 
#!/bin/bash
read -p "type a key and Enter: " key
echo "the key was $key"

:~$ ./test1.sh | tee junk
type a key and Enter: G
the key was G

:~$ cat junk
the key was G

С 2>&1 перенаправление:

:~$ ./test1.sh 2>&1 | tee junk
type a key and Enter: G
the key was G

:~$ cat junk
type a key and Enter: the key was G

С echo строка:

:~$ cat test.sh 
#!/bin/bash
echo -n "Type a key and press Enter: "
read key
echo "the key was $key"

echo строка с командой мишени:

:~$ ./test.sh | tee junk
Type a key and press Enter: X
the key was X

:~$ cat junk
Type a key and press Enter: the key was X

Пример никакого сценария:

С stderr:

:~$ read -p "Type a key and press Enter: " key 2>&1 |tee junk; echo "The key was $key" | tee -a junk
Type a key and press Enter: F
The key was 

:~$ cat junk
Type a key and press Enter: The key was 

С echo и несколько команд мишени вместо этого:

:~$ echo -n "Type a key and press Enter: " | tee junk; read key; echo "The key was $key" | tee -a junk
Type a key and press Enter: F
The key was F

:~$ cat junk
Type a key and press Enter: The key was F

Надеюсь, это поможет!

1
ответ дан 1 December 2019 в 13:23

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

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