web-dev-qa-db-ja.com

bashスクリプトをbashにパイプするときにパラメータを設定する方法

パラメータを使用してbashスクリプトを実行する方法:

./foo.sh a b c

圧縮されたとき(例:xzを使用)。

 xzcat foo.sh | bash <<how_to_supply_here_parameters?>>

特定のユースケース:

とても大きいrmlint.shファイルを圧縮して保存します。

time rmlint -o sh:stdout -c sh:hardlink|tee >( xz > rmlint.sh.xz )

したがって、通常は実行します

./rmlint.sh -d -x -p

ただし、ファイルが大きすぎて圧縮できません。したがって、bashにパイプで接続して同じことをしたいと思います。

xzcat rmlint.sh.xz | bash ...

渡す引数を区切るには、-sオプションと--を使用する必要があります。

echo 'echo "$@"' | sh -s 3 4 5

echo 'printf "{%s}" "$0"; printf " {%s}" "$@"; echo' |
    sh -s -- -d -x -p --foo=bar
{sh} {-d} {-x} {-p} {--foo=bar}

これは、bashだけでなく、あらゆるPOSIXシェルで機能します。 susv4 から:

-s標準入力からコマンドを読み取ります。

オペランドがなく、-cオプションが指定されていない場合、-sオプションが想定されます。

10
mosvy