混乱する以外は大丈夫です。さらに、それらは同じではありません。
$ date=/bin/ls
$ type date
date is hashed (/bin/date)
$ type $date
/bin/ls is /bin/ls
$ moo=foo
$ type $moo
-bash: type: foo: not found
$ function date() { true; }
$ type date
date is a function
date ()
{
true*emphasized text*
}
$ which true
/bin/true
$ type true
true is a shell builtin
コマンドを入力すると、bash は 3 つの異なる場所を検索してそのコマンドを見つけます。優先順位は次のとおりです。
- シェル組み込み (ヘルプ)
-
- シェル エイリアス (ヘルプ エイリアス)
- シェル関数 (ヘルプ関数)
- $PATH からハッシュされたバイナリ ファイル (「左端」のフォルダが最初にスキャンされます)
変数にはドル記号が前に付いているため、上記のすべてとは異なります。あなたの例と比較するには: $date と date は同じものではありません。したがって、変数と関数に同じ名前を付けることは実際には不可能です。それらには異なる「名前空間」があるためです。
少し混乱するかもしれませんが、多くのスクリプトはファイルの先頭に「メソッド変数」を定義しています。例えば
SED=/bin/sed
AWK=/usr/bin/awk
GREP/usr/local/gnu/bin/grep
一般的に行うことは、変数名を大文字で入力することです。これは、次の 2 つの目的で役立ちます (混乱を避けることは別として)。
- $PATH がありません
- すべての「依存関係」が実行可能であることを確認する
次のように実際に確認することはできません。
if [ "`which binary`" ]; then echo it\'s ok to continue.. ;fi
バイナリがまだハッシュされていない場合(パスフォルダーにある場合)、エラーが発生するためです。