2

それほど頻繁ではありませんが、私を悩ませるほど頻繁に、文字列*G*を変数に入れて「エコー」すると、通常は BASH が指しているディレクトリ内のテキスト ファイルから、いくつかのファイル名が表示されます。それはオートコンプリート機能かもしれないと思ったのですが、それらの領域には何も見つかりません。その文字の組み合わせで文字列をエコーすると何が起こっているのか誰か教えてもらえますか? できれば「オフ」にしたいです。

4

2 に答える 2

3

これはワイルドカードであり、現在のディレクトリ内のすべてのファイルに名前の文字が一致しますG

Bash Reference Manualのこのセクションで説明されています。

本当に無効にしたい場合は、次を使用できます。

set -f

また

set -o noglob

ここで説明したように

しかし、これは驚くほど便利な機能なので、有効にしたままにして、使い方を学ぶことをお勧めします。

単一のコマンドでオフにしたい場合は、引用符またはバックスラッシュを使用して特殊文字をエスケープできます。

echo '*G*'
echo "*G*"
echo \*G\*

echoちなみに、この機能はコマンド固有のものではありません。シェル内のすべてのコマンドに適用されます。例えば:

ls *.txt

は、名前が で終わるすべてのファイルのディレクトリ リストを表示します.txt

于 2013-04-03T02:11:59.880 に答える
1

これはワイルドカード ファイル名であり、*G*単に任意の数の文字 (ゼロ以上)の後Gに任意の数の文字が続くことを意味します。

つまり、ファイル名に が含まGれています。を含むファイルがないG場合は、次のトランスクリプトに従って、元の文字列が返されbashます。

pax> mkdir qqq ; cd qqq ; touch paxfile

pax> ls -al
total 0
-rw-r--r-- 1 pax pax 0 Apr  3 10:05 paxfile

pax> echo *x*
paxfile

pax> echo *G*
*G*

シェルがファイル名を展開しないようにするだけで、これをオフにすることができます。

pax> echo '*x*'
*x*

または、展開したくないbashファイル名のコロンで区切られたリストを保持するGLOBIGNORE変数があるため、それを使用することもできますが、任意のディレクトリに設定するのはかなり面倒です(そして、はい、メソッド以下は、スペースが埋め込まれたファイルではうまく機能しないため、文句を言う前に、これはデモ目的のみです):

pax> GLOBIGNORE=pax

pax> echo *x*
*x*

pax> touch xyzzy twisty ; unset GLOBIGNORE ; GLOBIGNORE=$(echo *x* | tr ' ' ':')

pax> echo $GLOBIGNORE == * # only twisty should expand here (no x)
paxfile:xyzzy == twisty
于 2013-04-03T02:10:30.233 に答える