パイプ出力をシェルスクリプトの引数として使用できますか?

パイプ出力をシェルスクリプトの引数として使用できますか?

Myscript.sh入力として 1 つの引数を必要とするという bash シェル スクリプトがあるとします。

text.txtしかし、その引数として呼び出されるテキスト ファイルの内容が必要です。

これを試してみましたが、うまくいきませんでした:

cat text.txt | ./Myscript.sh

これを実行する方法はありますか?

答え1

コマンド置換

./Myscript.sh "$(cat text.txt)"

答え2

パイプ出力をシェル スクリプトの引数として使用できます。

次の方法を試してください:

cat text.txt | xargs -I {} ./Myscript.sh {}

答え3

私の意見では、この質問に正しく答えているのは @bac0n だけだと思いますが、その答えを完成させるために、パイプされた引数をスクリプト引数リストの先頭に追加する短いライナーを次に示します。

#!/bin/bash

declare -a A=("$@")
[[ -p /dev/stdin ]] && { \
    mapfile -t -O ${#A[@]} A; set -- "${A[@]}"; \
}

echo "$@"

使用例:

$ ./script.sh arg1 arg2 arg3
> arg1 arg2 arg3

$ echo "piped1 piped2 piped3" | ./script.sh
> piped1 piped2 piped3

$ echo "piped1 piped2 piped3" | ./script.sh arg1 arg2 arg3
> piped1 piped2 piped3 arg1 arg2 arg3

答え4

ファイル内に複数の引数セットがある場合(複数の呼び出しの場合)、以下を使用することを検討してください。xargsまたは平行例えば

xargs -d '\n' Myscript.sh < text.txt
parallel -j4 Myscript.sh < text.txt

関連情報