forコマンドの入力である `find .`と/home/user/*の違いは何ですか?

forコマンドの入力である `find .`と/home/user/*の違いは何ですか?

find .これらのコマンドで入力すること/home/user/*の違いは何ですかfor?たとえば、

for var in $(find .)
do echo "$var"
done

または

for var in /home/user/*
do
echo "$var"
done

最初の場合、forコマンドは名前にスペースを含むファイルを爆発させます。 2番目のケースではそうではありません。なぜ?

ベストアンサー1

これはシェルの標準動作です。作業順序は、コマンドの置換($(find .))、単語の分割、グローバル拡張(/home/user/*)です。

~からPOSIX規格(単語分割 = フィールド分割、グローバル拡張 = パス名拡張):

単語拡張の順序は次のとおりです。

  1. チルダ拡張(チルダ拡張を参照)、パラメータ拡張(パラメータ拡張を参照)、コマンド置換(コマンド置換を参照)、および算術拡張(算術拡張を参照)は、最初から最後まで実行する必要があります。トークン認識のトピック5を参照してください。

  2. IFSが空でない場合は、手順1で作成したフィールド部分に対してフィールド分割を実行する必要があります(フィールド分割を参照)。

  3. set -fが適用されない限り、パス名拡張を実行する必要があります(パス名拡張を参照)。

  4. 見積もりの​​削除(見積もりの​​削除を参照)は、常に最後に実行する必要があります。


したがって、単語分割がファイル名を妨げないように、可能であれば常にglobを使用することをお勧めします。構成$(find)は実際には例です。バッシュトラップ #1

おすすめ記事