それほど頻繁ではありませんが、私を悩ませるほど頻繁に、文字列*G*
を変数に入れて「エコー」すると、通常は BASH が指しているディレクトリ内のテキスト ファイルから、いくつかのファイル名が表示されます。それはオートコンプリート機能かもしれないと思ったのですが、それらの領域には何も見つかりません。その文字の組み合わせで文字列をエコーすると何が起こっているのか誰か教えてもらえますか? できれば「オフ」にしたいです。
2 に答える
これはワイルドカードであり、現在のディレクトリ内のすべてのファイルに名前の文字が一致しますG
。
Bash Reference Manualのこのセクションで説明されています。
本当に無効にしたい場合は、次を使用できます。
set -f
また
set -o noglob
ここで説明したように
しかし、これは驚くほど便利な機能なので、有効にしたままにして、使い方を学ぶことをお勧めします。
単一のコマンドでオフにしたい場合は、引用符またはバックスラッシュを使用して特殊文字をエスケープできます。
echo '*G*'
echo "*G*"
echo \*G\*
echo
ちなみに、この機能はコマンド固有のものではありません。シェル内のすべてのコマンドに適用されます。例えば:
ls *.txt
は、名前が で終わるすべてのファイルのディレクトリ リストを表示します.txt
。
これはワイルドカード ファイル名であり、*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