'xargs' は stdio を通して 'cd' に引数を送りません。

'xargs' は stdio を通して 'cd' に引数を送りません。

私の経験では、「xargs」に現れる動作は非常に予想外のようです。 「ls」を使用して一致するフォルダ名を見つけ、「xargs」を使用して「cd」に送信します。フォルダが存在しないというメッセージが表示されます。しかし、「xargs」を使用しないと、「cd」は機能します。また、「xargs」を使用しますが、「cd」の代わりに「ls」に送信すると機能します。

# Identify desired directory
ls -d *[Aa]nt*

   201909+ants/

# Print the desired command with "echo"
ls -d *[Aa]nt* | xargs echo cd

   cd 201909+ants/

# Execute the desired command and get error
ls -d *[Aa]nt* | xargs cd

   xargs: cd: No such file or directory

# Confirm that the desired command without "xargs"
cd 201909+ants  # This works no problem
cd ..           # Go back up
cd 201909+ants/ # This works no problem
cd ..           # Go back up

# Confirm that "xargs" with "ls"
ls -d *[Aa]nt* | xargs ls -d

   201909+ants/

私はこれがキーボードと椅子の間のID1OTの問題であると確信しています。誰でも私の間違いがどこにあるかを指摘できますか?

CygwinでBashを使用していますが、Linuxではほとんど違いはありません。このような違いを最後に見たのがいつなのか覚えていません。

答え1

作業ディレクトリは実行中のプロセスの属性であり、プロセス自体内で変更する必要があります。したがって、cdこれはシェルに組み込まれたコマンドです。ただしxargs、(通常)そうではなく、シェル組み込み機能を実行することはできません。それがすることは外部プログラムを呼び出すだけです。

実際には外部プログラムとして機能しないため、cd通常Linuxシステムでは使用できません。これがエラーが発生する理由です。

一部の仕様に従う必要があるため、他のシステムでも同様です。バラよりCDはなぜプログラムではないのですか?。しかし、あまり役に立ちません。プロセスの作業ディレクトリのみを変更し、cdすぐに終了します。

lsしかし、ここでもそうする必要はありませんxargs。これをls *.txtやってみるとそうです。シェルパターンに一致するファイル名のリストを生成し、リストは、ls... に渡され、印刷されます。あなたがしたこととほぼ同じですecho *.txt。 (ファイルの他のすべてのデータを見つけるために実際の作業が行われる場所なので、ls -l *.txtより意味があります。)したがって、重複するのではなくコマンドラインを使用して印刷できます。 、これを他のプログラムのコマンドラインへの入力に変換します。lsls *[Aa]nt* |xargsecho *[Aa]nt* | xargsechoxargs

簡単な場合は、直接使用できる必要があります。

cd *[Aa]nt*

ただし、パターンが複数のファイル名と一致すると、エラーが発生します(または、cd foo bar現在の作業ディレクトリパスの文字列置換など、一部のシェルでkshで奇妙な動作が発生します)。

(もちろんls *.txtパイプにリダイレクトするとき、ファイル名は1行に1つずつ出力されますが、echo *.txt1行にすべて出力するのでそうではありません。正確に同じ。 )

関連情報