
私はしばらくこの問題に悩まされてきましたが、誰かが私に明確に説明してくれると本当にありがたいです。2つのコマンドをパイプでつなげようとしているとしますreadlink
。cat
readlink Command output
$ readlink -f SUService.log
/cygdrive/c/SUService.log
さて、このようなことをやろうとすると(失敗します)
$ readlink -f SUService.log | cat
このようなことはうまくいくだろうが
$ readlink -f SUService.log | xargs cat
なぜそうなるのか知りたかったのですが、これここで投稿した投稿では、OPが同様の質問をしており、これ引数と入力の違いを説明しようとする投稿ですが、受け入れられた回答をまだ理解できませんでした。私が理解していることは、引数として入力が必要なreadlink
ときに、端末画面である stdout に結果を返すということですcat
。これにより、コマンドの出力 (locate や readlink など) が次のコマンドの引数として機能するかどうかをどのように確認すればよいのかという疑問が生じます。さらに読んでいくと、xarg コマンドをいつ使用すればよいのかを知りたいことがわかりました。
答え1
あなたの例はかなり混乱しています。
通常、cat には任意の文字を送信するわけではありません。
通常はファイルを cat に送信します。
それでも、cat にいくつかの文字を送信すると、その文字が印刷されます。
$ echo abc12123 | cat
abc12123
通常、ファイル名をcatに送信します
$ cat abc12123
cat: abc12123: No such file or directory
したがって、 cat 自体は、パイプで渡された奇妙な文字を、パラメーターとして渡された場合とは異なった方法で処理することに注意してください。
$ cat b.b
textofb.b
$ echo b.b | cat
b.b
$ cat b.b
textofb.b
あなたの例よりも簡単な例を使います
$ echo b.b | xargs cat
textofb.b
bb の内容が印刷されるのがわかります。これは asdfasdfs | xargs cat
、asdfasdfs の出力を cat のパラメーターとして送信するためです。
それで
echo b.b | xargs cat
=
cat b.b
echo b.b | cat
一方、は cat b.b
答え2
次のコマンドはない失敗します。単に予想外の動作をするだけです。
readlink -f SUService.log | cat
stdin が指定されるとcat
、それを stdout にコピーします。その中でファイル名は検索されません。
あるいは、これは指定されたファイルから読み取ります:
cat "$(readlink -f SUService.log)"
xargs
コマンドラインにも名前が付けられcat
、同じ結果が得られます。
readlink -f SUService.log | xargs cat
答え3
cat と xargs のマニュアルページを見て、それらが何をするのかを確認してください。
man cat
cat - concatenate files and print on the standard output
そして:
man xargs
xargs - build and execute command lines from standard input
ちょっとしたデモです
テストファイルを作成しましょう:
echo "a" > test
echo "b" >> test
echo "c" >> test
猫
cat test
ファイルを読み取り、次の結果を返します:
a
b
c
エコー | 猫
echo test | cat
によればman cat
、これは次と同じことを行います:
echo test | cat -
これはtest
cat の stdin にパイプされ、cat に stdin から読み取るように指示します。
エコー | xargs 猫
echo test | xargs cat
次のコマンドを生成して実行します。
cat test
この出力はすでに示しました。
もし走ったら
<test xargs -n1 cat
Xargs は入力時にこれを認識します:
a
b
c
そして、次のコマンドが生成されます。
cat a
cat b
cat c
これらのファイルは存在しないため、3 つのエラーが発生します。
なぜ-n1
?
によればman xargs
、 は-n1
xargs に、生成する各コマンドで 1 つの引数 (stdin から読み取る) を使用するように指示します。
代わりにを使用すると-n2
、コマンドごとに最大 2 つのパラメータを使用する次のものが生成されます。
cat a b
cat c
または-n3
それ以上を使用する場合、または単に を省略する場合は、次のようになります-n
。
< test xargs cat
我々が得る:
cat a b c