質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

4回答

14472閲覧

xargsとパイプの違いについて

hirhir

総合スコア11

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

1クリップ

投稿2017/01/29 11:10

xargsとgrepの違いについてよくわからないので教えてください。
例えば、カレントディレクトリにa.txt, b.txtが存在しているとします。
(OSはmacOSで試しています。)

その状態で、パイプを使用してfindとrmを繋ぐと、上手くいきません。

$ find . -regex .*[a-z].txt | rm -v usage: rm [-f | -i] [-dPRrvW] file ... unlink file

一方でxargsを使用してrmの引数にfindの結果を加えると、上手くいきます。

$ find . -regex .*[a-z].txt | xargs -t rm -v rm -v ./a.txt ./b.txt ./a.txt ./b.txt

私の理解は以下です。おそらく何か大きな勘違いしているのだと思います。。。

ー私の理解ーーーーーーーーーーーーーーーーーーーーーーーーーーー
rmを普段使う時って、標準入力から削除対象のファイル引数として渡しますよね。。なので、パイプでfindのstdoutをrmのstdinに繋いであげれば、findの結果出力されたファイル群を削除してくれるはず。。。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

xargsやパイプの仕組みに詳しい方、教えて頂けないでしょうか??

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

rmを普段使う時って、標準入力から削除対象のファイル引数として渡しますよね。

これが、大きな間違いです。今までrmを使ったことが無い??
削除対象ファイルはコマンドラインで与えます。
例:rm foo
rmは標準入力を読みません。

#追記
書きぶりから、rmコマンドを使ったことがないとは思えないので、コマンドラインと標準入力の言葉の区別が付いていないと言うことですかね。
echo・・・コマンドライン引数を標準出力に出力する
cat・・・(コマンドライン引数無しでcatコマンドを起動した場合)標準入力から入力して標準出力に出力する
で、分かりますでしょうか?

投稿2017/01/29 11:16

編集2017/01/29 11:22
otn

総合スコア85778

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

簡単な説明ですが、例えば、パイプの場合とxargsの違いは、
(1)rm
echo file1 file2 | rm ---はNGですが
echo file1 file2 | xargs rm ---はOKです。

(2)cat
echo file1 file2 | cat ---はOKです
echo file1 file2 | xargs cat ---もOKです

rmとcatの違いは、stdinを入力としているかいないがです。

(1)を書き換えた場合下記と同じ動きになります。
rm <(echo file1 file2) --はNGです。
rm file1 file2 --はOKです。

(2)catの場合stdinがない場合は、パラメータの指定ファイルをオープンします。
cat <(echo file1 file2) --はstdinでOKです。
cat file1 file2 --はファイルでOKです。
但し、上記は”file1 file2”の文字列が出力され
下記は、file1 file2の内容がコンカチされて出力されます。

投稿2017/01/29 11:57

A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

私もパイプとxargs、コマンド引数と標準入力に関して混乱していたので以下に私の理解をまとめます。

  • コマンド引数   :  コマンドの右側に書いてそのコマンドに与える文字や数値。
  • 標準入力     : そのコマンドへの入力元。コマンド引数とはまた別物。通常は端末。
  • 標準出力     : そのコマンドの出力先。通常は端末。
  • リダイレクション : そのコマンドの標準入出力を<,>で指定する。指定なしだと端末。

 例(出力)% pwd > fileA.txt
例(入力)% cat < fileA.tx

  • パイプ      : 2つのコマンドの標準出力(>)と標準入力(<)を同時にした物。

 例)% pwd | cat
注意)>はパイプではなく出力先の指定。なので以下ではcatと言うファイルができる。
% pwd > cat

  • xargs        : その標準入力を引数で指定したコマンドの引数にしてして実行。

 例)% pwd | xargs grep ABC
% grep ABC pwdとしたのと一緒。

  • cat,head,tail, ls等  : 引数と標準入力両方同じ様に取れる。

 例)% cat fileA.txt
% cat < fileA.txt

  • rm, echo等      : 引数のみ取れる。標準入力なし。

 例(O.K)% rm fileA.txt
例(N.G)% rm < fileA.txt

なので標準入力がないrmにパイプを使うのはN.Gです。rmを使うには引数を指定する必要があります。xargsを使えばxargsの標準入力をrmの引数にして実行してくれます。

% echo fileA.txt | rm      引数がないのでN.G
% echo fileA.txt | xargs rm  xargsがecho fileA.txtの結果をrmの引数にしてくれるのでO.K

投稿2020/06/19 02:13

編集2020/06/20 01:14
vega77

総合スコア17

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

otnさんと同じく質問者さんはパイプ(標準入力)と引数を勘違いなさっていると思いますので私は補足までに

xargsは「標準入力を引数に変換」してくれるものです。

例えば、echo a | echoとしてもなにも起きません。
しかし、echo a | xargs echoとするとaが表示されます。これはxargsが(xargsの引数) (標準入力)にコマンドを変換して実行します。

分かりづらければ、プログラムの話をすると、引数はc言語ではargs[]で取ります(正確にはmain関数の第2引数ですがそれは理解のために省略)

一方、標準入力はc言語ではstdinという変数を使ってfread(str, 256, 1, stdin)のように読み込みます。

つまり、標準入力とプログラムの後ろにつく引数は全く別物なんです。
パイプで渡されるものは、パイプの前の標準出力であり、パイプの後ろのコマンドには標準入力にその値が渡ります。
パイプの前後の引数と標準入出力は何の関係もありません。本来、何の関係もない標準入出力を引数に展開してくれるのがxargsというわけです。

ただ、UNIXのコマンドは往々にして標準入出力を引数のように扱ってくれるコマンドがありますから(headとかtailとか)、勘違いされるのも仕方ないかなと思います。

投稿2019/08/26 13:36

impepc

総合スコア86

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問