私の経験では、「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
より意味があります。)したがって、重複するのではなくコマンドラインを使用して印刷できます。 、これを他のプログラムのコマンドラインへの入力に変換します。ls
ls *[Aa]nt* |xargs
echo *[Aa]nt* | xargs
echo
xargs
簡単な場合は、直接使用できる必要があります。
cd *[Aa]nt*
ただし、パターンが複数のファイル名と一致すると、エラーが発生します(または、cd foo bar
現在の作業ディレクトリパスの文字列置換など、一部のシェルでkshで奇妙な動作が発生します)。
(もちろんls *.txt
パイプにリダイレクトするとき、ファイル名は1行に1つずつ出力されますが、echo *.txt
1行にすべて出力するのでそうではありません。正確に同じ。 )