xargs
コマンドで困っていますpipe
。ここに一例を示します =
echo 'a' | xargs mkdir
このコマンドは、 という名前のディレクトリを作成しますa
。したがって、このコマンドは、mkdir a
しかし、なぜこのコマンドは機能しないのでしょうかecho 'a' | mkdir
?
pipe
コマンドが左のコマンドの出力を右のコマンドの引数として転送するとき、| xargs
コマンドは左のコマンドの出力を右のコマンドの入力として転送すると読みました。
1-入力と引数の違いは何ですか?
2-echo 'a' | mkdir
このコマンドが機能しないのはなぜですか? また、このコマンドと同等のものは何ですか?
ありがとう...
答え1
簡単な答え
引数は入力です。
より長い回答
他にも入力方法はたくさんあります。
この例では、標準入力を読み取ることをecho 'a' | mkdir
期待しています。ただし、これを行うようには書かれていません。mkdir
mkdir
入力と呼んでいるものは標準入力 ( stdin
) です。出力は標準出力 ( stdout
) です。すべて標準エラー ( ) ですstderr
。そして終了コードです。
さらに長い答えですが、違いは何でしょうか?
引数は、プログラムを起動する前に使用可能である必要があります。引数は通常、短いもので、オプション、ファイル名、および短いテキストが含まれます。
標準入力は、プログラムの実行中に書き込むことができます。プログラムの起動時には存在しなかったデータを標準入力に送信できます。順序どおりに読み取ることができるとは限らないため、順番に読み取ってください。任意の長さにすることができます。プロセスごとに標準入力は 1 つだけなので、さらに必要な場合は、ファイル名を引数として送信します。
どうすればいいecho 'a' | xargs mkdir
かxargs
mkdir "$(echo 'a')"
は$()
、含まれているコマンドを実行し、 と$()
その内容をそのコマンドの標準出力に置き換えることを意味します。
答え2
私もこれについて長い間混乱していました。もう少し単純な例を挙げてみます (私は Bash の専門家ではありません)。
wc "test"
wc <<< "test" (same as: echo "test" | wc)
これら 2 つの結果は非常に異なります。最初のものはファイル を読み取ろうとしますtest
が、2 番目のものは を表示します1 1 5
。
ここで問題とwc "test"
なるのは、口論 "test"
wc <<< "test"
入力として、標準入力。
したがって、echo 'a' | xargs mkdir
(xargsはexecuteの略で、引数として)を発行すると、口論にmkdir
; それは次のようにするようなものです: mkdir a
。
一方、echo 'a' | mkdir
(より単純なのは : mkdir <<< 'a'
) を発行する場合は、stdin として渡しますa
。
mkdir
これらを非常に異なる方法で処理するため、表示される結果が異なります。