私は次のエイリアスを定義しました。
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)