これは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ファイル」を意味します。これは素晴らしい副作用ですが、驚くべき副作用は悪いです。
独自のデータのための 'PATH'を使用しないでください。すでに使用されています。 ( 'PATH = '*''を設定した後に 'ls'を実行してみてください。)一般に、大文字のみで構成される変数名は使用しないでください。 – chepner
ありがとうございます。 PATHは使用しないでください。この質問の目的を果たした後に捨てられるスクリプトの中にあったので、害は起きなかった。 – H2ONaCl
スクリプト内であっても、 'PATH'ルックアップで見つからない場合、外部コマンドを実行することができない場合があります。 – chepner