したがって、私のスクリプトが標準出力にエコーされるこの行で動作する必要があるBourne-shellスクリプトを作成する必要があります。たとえば、次のようになります。
echo *something* | myscript.sh [parametres...]
これはおそらく私が学習過程で見落としたかもしれない基本的なものです。私の試みを含めますが、解決策とは離れています。とにかくどんなアドバイスにも感謝します。
答え1
ここで注意すべき重要な点は、子が親のSTDIN / STDOUT / STDERRファイル記述子を継承することです。つまり、他のプロセス(例と同じパイプ)のSTDOUTに接続されているSTDINを使用してスクリプトを起動すると、スクリプトが開始するすべての項目のSTDINも他のプロセスの同じSTDOUTに接続されます。
echo foo | ./myscript.sh
どこかでこれを行う場合の意味は次のとおりですmyscript.sh
。
#!/bin/bash
sed -e 's/foo/bar/'
次にSTDOUTsed
で読み書きecho foo
します(起動時にリダイレクトされないため、TTYに接続されますmyscript.sh
)。
例:
$ echo foobar | ./myscript.sh
barbar
したがって、使用方法は実行する操作によって異なります。入力を変数としてキャプチャする場合は、組み込みread
関数を使用してこれを実行できます。
たとえば、
#!/bin/bash
IFS= read -rd '' foo
echo "foo=<$foo>"
結果:
$ echo -e 'hello\nworld' | ./myscript.sh
foo=<hello
world>
答え2
echo " foo bar " | {
# ...
IFS= read -r line
echo "$line"
}
答え3
パイプの左側の標準出力は、パイプの右側の標準入力に接続されます。あなたの例では、の出力がのecho
入力になりますmyscript.sh
。
echo
出力全体を変数に保存するには、コマンド置換を使用できますcat
。
whole_input=$(cat)
これにより、入力の末尾から改行文字が削除されます。
read
一度に 1 行ずつ読みたい場合は、組み込み機能を使用することもできます。一般はread
行をフィールドに分割し、バックスラッシュ連続を使用して追加の複雑さなしに行を読み取りますIFS= read -r
。
IFS= read -r first_line
IFS= read -r second_line