エイリアスの2番目のコマンドにパイプされた入力をどのように渡すことができますか?

エイリアスの2番目のコマンドにパイプされた入力をどのように渡すことができますか?

私は次のエイリアスを定義しました。

alias xyz='command1; command2'

他のコマンドpqrの出力をcommand2にパイプしたいと思います。たとえば、次のようになります。

pqr | xyz -f -

可能ですか?どうすればいいですか?

答え1

エイリアスの使用は通常いいえ非対話型シェルスクリプトのベストプラクティス(バッシュFAQ/080)。 OPでエイリアスを定義した方法で、最初のコマンドのみがstdinから読み取られます。なぜなら、;最初のコマンドの後にstdinが終了するからです。

{..}1つの可能なアプローチは、すべてのリダイレクトがグループ内の全コマンドセットに適用されるようにコマンドグループ化を使用することです。それでもalias定義を保持して実行できます。

alias xyz='{ command1; command2; }'

この場合、comamnd1不必要に標準入力のコピーが得られます。次の操作でドラッグできます

alias xyz='{ command1 < /dev/null ; command2 - ; }'

または、関数を使用してコマンドを定義します。

xyz() {
    command1; command2
}

シェルがプロセスbash置換をサポートしている場合は、stdinの内容を位置引数として受け取るようにzsh定義できます。command2関数を次のようにオーバーライドします。

xyz() {
    command1
    command2 "$@"
}

次に、コマンド(pqr)を次のように呼び出します。

xyz < <(pqr)

上記を簡単に説明すると、

zoo() { date; sed 's/foo/boo/' "$@"; }
zoo < <(echo food)                     #(or) zoo <<<"food"
Mon Nov 25 02:44:49 EST 2019
bood

答え2

次のxargsアプローチを試してください。

alias xyz='command1; command2 | xargs pqr'

pqrこれは入力引数を使用して実行するのと同じです。command2

答え3

command2コマンドリストの標準入力に何かを渡します。

command1; command2

command1標準入力から読まないように注意してください。これは標準入力をリダイレクトすることで/dev/null実現できますcommand1

command1 </dev/null; command2

これによりエイリアスが残ります。

alias xyz='command1 </dev/null; command2`

あなたはでしょういいえ電話できる

pqr | xyz -f -

なぜなら、次のようなものです。

pqr | command1 </dev/null; command2 -f -

これは次のとおりです。

pqr | command1 </dev/null
command2 -f -

代わりに、これをxyzシェル関数として定義してください。

xyz () {
    command1 </dev/null
    command2 "$@"
}

ここでは、command2関数に与えられたコマンドライン引数と一緒に関数の標準入力を取得します。

これで、パイプラインと同じように使用できますpqr | xyz -f -

-f -渡す引数がcommand2「標準入力から読み取る」(-標準入力を意味する)の場合にのみシェルがサポートしている場合は、-プロセス置換をに渡すことができます。xyz

xyz -f <(pqr)

上記の関数は実行と同じです。

command1 </dev/null
command2 -f <(pqr)

関連情報