エイリアス内の 2 番目のコマンドにパイプ入力を渡すにはどうすればよいですか?

エイリアス内の 2 番目のコマンドにパイプ入力を渡すにはどうすればよいですか?

次のようなエイリアスを定義しました:

alias xyz='command1; command2'

次のように、別のコマンド pqr の出力を command2 にパイプします。

pqr | xyz -f -

それは可能ですか?どうすれば実現できますか?

答え1

別名を使うのは一般的にない非対話型シェルスクリプトの優れた実践例(バッシュFAQ/080)。OP でエイリアスを定義した方法では、標準入力が最初;のコマンドを超えて終了するため、最初のコマンドのみが標準入力から読み取られます。

一つの方法は、 を使用してコマンドをグループ化し{..}、リダイレクトがグループ内のコマンドセット全体に適用されるようにすることです。alias定義を保持したまま、次のようにすることができます。

alias xyz='{ command1; command2; }'

その場合、comamnd1標準入力のコピーが不必要に取得されます。次のようにして閉じることができます。

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

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

xyz() {
    command1; command2
}

シェルがプロセス置換をサポートしている場合、bash位置引数として標準入力の内容を受け取るように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/nullcommand1

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)

関連情報