関数、エイリアス、実行可能ファイルのハイフンに問題はありますか?


25

私のテスト(BashおよびZシェル)では、名前にハイフンが含まれる関数またはエイリアスまたは実行可能なシェルスクリプトの定義に問題はありませんでしたが、これがすべてのシェルおよびすべてのユースケースで問題ないことを確信していません。

私がこれをしたい理由は、ハイフンはアンダースコアよりも入力しやすいため、より速く、よりスムーズになります。

それが問題ではないと信頼するのをためらう理由の1つは、一部の言語(Rubyなど)では、ハイフンが周囲にスペースがなくてもマイナス記号として解釈されることです。ハイフンがスペースなしでもオプションを通知するものとして解釈されるシェルで、このようなことが起こるかもしれませんが、私は驚かないでしょう。

私が少し疑っているもう1つの理由は、テキストエディターがハイフンを含む関数の構文強調表示を台無しにしていることです。(もちろん、シェルスクリプトの構成を強調する構文の単なるバグである可能性は完全にあります。)

ハイフンを避ける理由はありますか?

回答:


32

POSIXとハイフン:保証なし

POSIX標準によれば、関数名は有効な名前である必要があり、名前は次のもので構成できます。

3.231名前
シェルコマンド言語で、ポータブル文字セットのアンダースコア、数字、およびアルファベットのみで構成される単語。名前の最初の文字は数字ではありません。

さらに、エイリアスは有効なエイリアス名でなければなりません。

3.10エイリアス名
シェルコマンド言語で、アンダースコア、数字、およびポータブル文字セットのアルファベットと「!」、「%」、「、」、「@」のいずれかのみで構成される単語。

実装では、エイリアス名内の他の文字を拡張子として許可する場合があります。 (エンファシス鉱山。)

ハイフンはされていないのいずれかの場合には許可されなければならない文字の間に記載されています。したがって、それらが使用される場合、移植性は保証されません。

ハイフンをサポートしないシェルの例

dash/bin/shdebian-ubuntuファミリーのデフォルトのシェル()であり、関数名のハイフンをサポートしていません。

$ a-b() { date; }
dash: 1: Syntax error: Bad function name

興味深いことに、それはありません上記のように、これはあるものの、別名でサポートハイフンを実装特性、必要条件ではありません。

$ a_b() { printf "hello %s\n" "$1"; }
$ alias a-b='a_b'
$ a-b world
hello world

busyboxシェル(Almquistシェル)は、関数名のハイフンもサポートしていません。

$ a-b() { date; }
-sh: Syntax error: Bad function name

シェルによるハイフンサポートの概要

次のシェルは、関数名でハイフンをサポートすることが知られています:

  • ksh、bash、zsh

次のシェルは、関数名にハイフンをサポートしないことが知られてます。

  • ash(busybox)、csh、tcsh、dash

結論

  • ハイフンは非標準です。クロスシェル互換性が必要な場合は、それらに近づかないでください。
  • ハイフンの代わりにアンダースコアを使用します。アンダースコアはどこでも受け入れられます。

2
-それらに含まれる名前は悪です。CSS、あなたを見ています。:)
PM 2Ring 14年

ありがとう。後でテストしましたがcshtcshハイフンもサポートしていませんが、Kornシェルはサポートしていました。a-b()関数名としても使用したのは少しおかしいです。
iconoclast

@iconoclastシェルテストの結果を回答に追加しました。ありがとう。
John1024 14年

@ PM2Ringは、アンダースコア付きの名前よりも入力が簡単です。それらを許可しないシステムの伝統や実装の決定を除き、それらが悪であるという主張を支持するためにどの原則を指し示すことができますか?
iconoclast

1
@iconoclastハイフンはマイナス記号として解釈されるため、ハイフンを含む名前は多くの言語では不可能です。他の言語では異なる名前を持っています。
PM 2Ring

3

私はこれが本当に遅いことを知っていますが、アンダースコアをよりアクセスしやすくするという問題を回避できるかもしれません。

xmodmap -e "keycode  20 =  underscore minus"

これにより、アンダースコアがハイフン(マイナス)に切り替わります。

したがって、ハイフンのシフトを保持しますが、アンダースコアはシフトなしで入力されます。

キーコードは異なる場合がありますが、キーボードに依存すると思います。私はたまたま20歳です。使用する必要のあるキーコードを見つけるのに助けが必要な場合はお知らせください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.