テストファイルを作成しましょう:

テストファイルを作成しましょう:

私はしばらくこの問題に悩まされてきましたが、誰かが私に明確に説明してくれると本当にありがたいです。2つのコマンドをパイプでつなげようとしているとしますreadlinkcat

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 -

これはtestcat の 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、 は-n1xargs に、生成する各コマンドで 1 つの引数 (stdin から読み取る) を使用するように指示します。

代わりにを使用すると-n2、コマンドごとに最大 2 つのパラメータを使用する次のものが生成されます。

cat a b
cat c

または-n3それ以上を使用する場合、または単に を省略する場合は、次のようになります-n

< test xargs cat

我々が得る:

cat a b c

関連情報