web-dev-qa-db-ja.com

標準出力に書き込まれないコンソール出力の例

readは標準出力に書き込まないようです。

 $ cat test.sh 
#!/ bin/bash 
 read -p "キーを入力して入力" key 
 echo "キーは$ keyでした" 
 $ ./test.sh
キーを入力し、Enterx 
キーはx 
 $ ./test.sh | tee file 
キーを入力し、Enterx 
キーはx 
 $ cat file 
キーはx 
でした

スクリプトなしで試してみてください...

 $ read -p "キーを入力してEnter"キー| tee file 
キーを入力してEnterx 
 $ cat file 
 $ 

readコマンドは here で説明されています。簡単な説明:「標準入力から行を読み取る」。

The Linux Command Line(2nd Internet Edition) からのパイプ|についての情報は、William E. Shottsによるものです。

パイプ演算子「|」を使用する(垂直バー)、1つのコマンドの標準出力を別のコマンドの標準入力にパイプすることができます:command1 | command2

teeのmanページには、次の説明があります。

標準入力から読み取り、標準出力とファイルに書き込む

teeのmanページは、この link にあります。

コンソールに書き込むが実際には標準出力を使用しないプログラムの他のすべての例のリストはどこにありますか、またはそのようなリストがない場合、コンソールに書き込むプログラムがそうでない場合を知るための一般的なルールは何ですか?標準出力を使用していますか?

readは違反しているようです 最低驚きの原理

2
H2ONaCl

あなたの例では、readはstdoutではなくstderrに書き込んでいます。ここに私が知っている方法があります:

 $ read -p "キーを入力してEnterキーを押す:" key>/dev/null 
キーを入力してEnterキーを押す:x 
 $ read -p "キーを入力するEnterを押します: "キー2>/dev/null 
 x 

出力をリダイレクトするプログラムでこのテストを実行できます。

だからあなたが探しているコマンドはこれです:

 $ read -p「キーを入力してEnterキーを押します。」キー2>&1 | tee file 
キーを入力してEnterキーを押します:x 
 $ cat file 
キーを入力してEnterキーを押します:$ 

上記のリダイレクトの説明:

6
wjandrea

Wjandreaが言ったことで、readが行っているstderrをつかむことができるのは正しいことです。残念ながら、stderrを使用して読み取ろうとすると、keyの変数が保持されないため、echo $keyの出力は空白になります。ただし、スクリプトでは、読み取り行自体がスクリプト内のstderrからstdout2>&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"

teeコマンドを使用した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

Noスクリプトの例:

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と複数のteeコマンドを使用:

:~$ 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
Terrance