2012-01-10 6 views
2

私はbashスクリプトを書いていますが、関数名に感嘆符を使用すると便利です。感嘆符がbashの関数名にありますか?

例:

function hello! { 
    echo goodbye 
} 
function hello { 
    echo hello 
} 

そして、それは働きます!

単語、文字、数字、およびアンダースコアのみからなる、および文字またはアンダースコアで始まる:

specsを見た後、私はこれを見つけました。名前はシェル変数と関数名として使用されます。識別子とも呼ばれます。

私はここでルールを破っているように感じます。これは間違っていますか?将来この混乱が起こるでしょうか?実際に何が起こっているのですか?

答えて

4

奇妙なことに、なぜあなたの関数名に感嘆符を使用する方が便利なのですか?

一般的に、移植性の理由から、bangを使用したくない場合があります。特定のOSのインタプリタがそれを受け入れるだけなので、あなたがそのスクリプトを他の場所に配備する必要がある場合、わずかに異なるフレーバー/バージョンの他のインタプリタは受け入れられないかもしれません。

+0

私が書いている機能は、少しエラーチェックをするラッパーなので、それらを短くしたいです。ラッパーは!他のラッパーは警告を出力し、終了しません。それは物事をはっきりさせます。 – peter

+1

これは、 "!"(xits)を "!"同じように。潜在的な互換性の問題/バグ/それ以外のものは仕様に含まれていないものを使用する必要はありません;) – Timo

3

私はこの場合の意味についてはわかりませんが、仕様がこれを明確に述べていれば、それ以上のことは定義されていない動作であり、避けるべきです。

5

これはBash仕様に違反しているので、Bashのバグを悪用しようとしているので、バグ修正時にコードが動作しない可能性があります。 !

2

これはお勧めできません。あなたのコードを移植可能にする場合は、関数名で記述します。 bash --posixまたはbashを "sh"として呼び出すと、両方とも "hello!"関数名として指定します。しかし、私は、関数の重要な使用法の1つは、ユーザが通常のコマンドとこれらのコマンドをオーバーライドできるようにしているので、bashが異常な関数名( "hello?" "hello-"と "hello /" ls、rmなど)には、ファイルシステムで許可されている任意の種類の文字を含めることができます。

"hello!" 変数という名前では機能しません。

関連する問題