このスクリプトは次のとおりです。
#!/bin/bash
tmppipe=/tmp/temppipe
mkfifo $tmppipe
echo "test" > $tmppipe
cat $tmppipe
exit
終了しません。cat
コマンドがパイプのコマンドを待っているとしますEOF
。どうやって送りますか?
ベストアンサー1
いいえ
echo test > "$tmppipe" # BTW, you've got the quotes in the wrong places
それがかかっています。より正確には、パイプを実行する前に書き込み用にパイプを開くシェルですecho
。
pipe
実行中のプロセス間で使用するプロセス間通信メカニズム。同時に。ここでopen(WR_ONLY)
(>
)は、他のプロセスが読み取りモードを実行するまでブロックされますopen
。
echo test > "$tmppipe" &
cat < "$tmppipe"
同時に実行されるecho
ため動作します。cat
Linuxでは、次のことを行うことができます。
exec 3<> "$tmppipe" 4< "$tmppipe"
echo test >&3
exec 3>&-
cat <&4
これは、Linuxでパイプの読み取り+書き込みopen
()がブロックされず、byの出力がパイプに入るほど小さいため、書き込みと読み取りを順次実行できるために機能します。<>
test\n
echo
次のような大きな出力には機能しません。
exec 3<> "$tmppipe" 4< "$tmppipe"
seq 100000 >&3
exec 3>&-
cat <&4
パイプ(現在のLinuxバージョンでは64kiB)を埋め、seq
他のプロセスがパイプから読み取られるまでブロックされます。これはcat
完了するまで実行されないため発生しません。seq
気づく:
echo test 1<> "$tmppipe"
cat < "$tmppipe"
コマンドラインがパイプを開き、テストを作成してからパイプを閉じるので動作しませんecho
(開いたファイル記述子がもう存在しないため、システムはパイプを破壊します)。したがって、次のcat
コマンドラインは新しいパイプをインスタンス化しようとします(書き込むためにfifoファイルを開くまでブロックします)。