bash の * はどのようにプログラムに渡されるのでしょうか?

bash の * はどのようにプログラムに渡されるのでしょうか?

多数の PDF を含むフォルダーを入力するとevince *、evince に何が送信されますか? evince は X 個の引数を受け取りますか、それとも X 回 evince が開かれ、それぞれが 1 つの引数 (1 つのファイル) を受け取りますか?

答え1

Bashは各コマンドラインでシェル拡張を実行します。その拡張の1つはファイル名の拡張*に従って置き換えられるパターンマッチングルール。

の場合evince *、 は*現在の作業ディレクトリの内容に置き換えられます。 内容とは、通常のファイル、サブディレクトリ、リンクなどの名前を意味します。ドットファイルは除外されます。 基本的に、 を実行すると取得されますls。 この場合は、PDF のファイル名です。

したがって、evinceバイナリは Bash によって 1 回だけ実行され、引数は現在の作業ディレクトリに含まれるアルファベット順のファイル名になります。その後 Evince が起動を処理する方法は、Evince またはそれが依存するフレームワークやライブラリによって異なりますが、ベアボーン X はここでは何も特別なことをしません。Evince や X は、 で実行されたことすら知りません*。たとえば、次のようになります。

$ ls -a
. .. .hiddendoc.pdf doc1.pdf doc2.docx otherdoc.pdf somedir
$ evince *
# is equivalent to
$ evince doc1.pdf doc2.docx otherdoc.pdf somedir

*がどのように展開されるかを知りたい場合は、 を実行するだけですecho *。作業ディレクトリが空の場合 (ドットファイルのみを含む場合)、アスタリスクは展開されず、コマンド実行の引数として残ることに気付くでしょう。

リンクされた Bash マニュアルに記載されているように、この動作を変更する設定がいくつかあります。他のシェルについては言うまでもありません。

関連情報