4

~/.bashrc に次のコードがあります。

date=$(which date)
date() {
  if [[ $1 == -R || $1 == --rfc-822 ]]; then
    # Output RFC-822 compliant date string.
    # e.g. Wed, 16 Dec 2009 15:18:11 +0100
    $date | sed "s/[^ ][^ ]*$/$($date +%z)/"
  else
    $date "$@"
  fi
}

私が知る限り、これはうまく機能します。同じ名前の変数と関数を持たないようにする理由はありますか?

4

3 に答える 3

4

混乱する以外は大丈夫です。さらに、それらは同じではありません。

$ 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 つの異なる場所を検索してそのコマンドを見つけます。優先順位は次のとおりです。

  1. シェル組み込み (ヘルプ)
    • シェル エイリアス (ヘルプ エイリアス)
    • シェル関数 (ヘルプ関数)
  2. $PATH からハッシュされたバイナリ ファイル (「左端」のフォルダが最初にスキャンされます)

変数にはドル記号が前に付いているため、上記のすべてとは異なります。あなたの例と比較するには: $date と date は同じものではありません。したがって、変数と関数に同じ名前を付けることは実際には不可能です。それらには異なる「名前空間」があるためです。

少し混乱するかもしれませんが、多くのスクリプトはファイルの先頭に「メソッド変数」を定義しています。例えば

SED=/bin/sed
AWK=/usr/bin/awk
GREP/usr/local/gnu/bin/grep

一般的に行うことは、変数名を大文字で入力することです。これは、次の 2 つの目的で役立ちます (混乱を避けることは別として)。

  1. $PATH がありません
  2. すべての「依存関係」が実行可能であることを確認する

次のように実際に確認することはできません。

if [ "`which binary`" ]; then echo it\'s ok to continue.. ;fi

バイナリがまだハッシュされていない場合(パスフォルダーにある場合)、エラーが発生するためです。

于 2012-10-06T03:27:27.723 に答える
2

Bash では変数を逆参照するために常に を使用$する必要があるため、好きな名前を自由に使用できます。

ただし、グローバルのオーバーライドには注意してください。

以下も参照してください。

http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_02.html

于 2012-10-06T03:30:32.757 に答える
2

変数を使用する代わりに、bash のcommandキーワードを使用します (マニュアルを参照するhelp commandか、プロンプトから実行してください)。

date() {
    case $1 in
        -R|--rfc-2822) command date ... ;;
        *) command date "$@" ;;
    esac
}
于 2012-10-06T13:24:19.723 に答える