プログラムに入力として与えられたファイルを処理するプログラムを作成しようとしていますが、値渡しとパラメータ経由での両方のパイプラインをサポートします。パラメータとstdinを同じ変数に読み込み、空白を残す
find . -type f | program -dvs
または多分あなたは同じことをやってみたいが、内のすべてのファイルについて:
例えば、1はフラグを使用して、現在のディレクトリ内のすべてのファイル上でプログラムを実行したい場合があります-dvs $ FILES_TO_CHECK変数:
echo "$FILES_TO_CHECK" | program -dvs
これは私がこれまで持っているコードです:と
tmp1() {
local in=("[email protected]")
if read -t 0 -u 0; then
local pipe=""
read -d '' -u 0 pipe
in+=(${pipe})
fi
local param
for param in "${!in[@]}"; do
echo "'$param' => '${in[$param]}'"
done
}
テスト:上記
echo "cba" "bca" "cba abc" | tmp1 "a" "b" "c" "abc" "abc cba"
echo; echo; echo
find . -type f
find . -type f | tmp1 "a" "b" "c" "abc" "abc cba"
は、次のように出力できます:
'0' => 'a'
'1' => 'b'
'2' => 'c'
'3' => 'abc'
'4' => 'abc cba'
'5' => 'cba'
'6' => 'bca'
'7' => 'cba'
'8' => 'abc'
./1
./2
./3
'0' => 'a'
'1' => 'b'
'2' => 'c'
'3' => 'abc'
'4' => 'abc cba'
近いですが、私は望んでいない、まさに:
'0' => 'a'
'1' => 'b'
'2' => 'c'
'3' => 'abc'
'4' => 'abc cba'
'5' => 'cba'
'6' => 'bca'
'7' => 'cba abc'
./1
./2
./3
'0' => 'a'
'1' => 'b'
'2' => 'c'
'3' => 'abc'
'4' => 'abc cba'
'5' => './1'
'6' => './2'
'7' => './3'
私はトップケースわからないんだけど(パイプされた値からスペース文字を維持する)ことはまったく可能ですが、そうであればどうしますか?
2番目のケースでは、検索結果がプログラムによって読み取られないのはなぜですか?
編集:これを行うための他のより良い方法がある場合は、私もすべての耳です。 実際のループは後ではるかに複雑になるので、私はパラメータ用に1つのループを作成し、パイプされた値用にもう1つのループを作成しないでください。
stdinから条件付きで読むために 'read -t 0 'を使うのはアンチパターンです。 UNIXコマンドは予測可能でなければなりません。常にstdinから読み込むか、決して実行しないでください。私はそれを単純に保ち、コマンドラインだけを解析することを勧めます。出力を引数に変換したい場合、 'xargs'を使うことができます。 –
'xargs'を使うと' xargs:tmp1:No such file or directory'という出力が出ます。私がこれを得ることができたら、私はあなたに同意するでしょう。 – TheNamlessGuy