2016-09-07 4 views
1

これはglobbingのテストです。 globbingは、$ PATHと$ NOTHERでは期待通りに機能しますが、$ JAVACLASSPATHでは機能しません。代わりにコロンを含むファイル名がないので一致がないのにトークンはエコーされます:グロブ動作がトークンのプリントに置き換えられています

> ls -l 
total 8 
-rw-rw-r-- 1 brian brian 6 Sep 7 16:20 lib.txt 
-rwxrwxr-x 1 brian brian 102 Sep 7 16:18 test.sh 
> cat test.sh 
#!/bin/bash 
PATH='*' 
JAVACLASSPATH='lib:*' 
NOTHER='lib*' 
echo $PATH 
echo $JAVACLASSPATH 
echo $NOTHER 

> ./test.sh 
lib.txt test.sh 
lib:* 
lib.txt 
> 

なぜトークンがエコーされるのですか?グロブが無効になっているようですが、Javaプログラマにとっては便利です(グロブ拡張でLinux上で間違ったスペース区切り文字が使用されるため、Javaでは:の区切り文字が必要です)。*はjavaにとって特別な意味を持っています。すべてのJARファイル ")。

編集:heemaylに示されているように、マッチグロブがない場合、変更されていないトークンが生成され、動作が文書化されます。つまり、Javaのクラスパスには*が表示されます。これは「すべてのJARファイル」を意味します。これは素晴らしい副作用ですが、驚くべき副作用は悪いです。

+0

独自のデータのための 'PATH'を使用しないでください。すでに使用されています。 ( 'PATH = '*''を設定した後に 'ls'を実行してみてください。)一般に、大文字のみで構成される変数名は使用しないでください。 – chepner

+0

ありがとうございます。 PATHは使用しないでください。この質問の目的を果たした後に捨てられるスクリプトの中にあったので、害は起きなかった。 – H2ONaCl

+0

スクリプト内であっても、 'PATH'ルックアップで見つからない場合、外部コマンドを実行することができない場合があります。 – chepner

答えて

2

現在のディレクトリ内のファイルをグロブパターンと照合しており、現在のディレクトリにlib:で始まるファイルが存在しないためです。 lib:txtのようなファイルがある場合は、グロブパターンlib:*が代わりに展開されます。

任意ファイルはグロブパターンにマッチしていない場合にも、パターンがman bashの関連部分を引用する、文字通り扱われる:

一致するファイル名が見つからないと、シェルオプションnullglobが有効でない場合、単語は変更されません。

あなたはnullglobシェルオプションを使用してこの動作を防ぐことができますしたい場合:

shopt -s nullglob 
+0

"パターンは文字通り扱われますか?"これはどこかに書かれていますか? – H2ONaCl

+0

> ls lib:* ls:libにアクセスできない:*:そのようなファイルやディレクトリはありません。 – H2ONaCl

+0

ls lib:*うまく動作しているようです。 – H2ONaCl

関連する問題