web-dev-qa-db-ja.com

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

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

私がこれを行いたい理由は、ハイフンはアンダースコアよりも入力が簡単で、そのためより高速でスムーズになるためです。

一部の言語(Rubyなど)ではハイフンがスペースなしでもマイナス記号として解釈されるため、問題がないと私が確信するのをためらっています。スペースがなくてもハイフンがオプションのシグナルとして解釈されるシェルでこのようなことが発生しても、私は驚かないでしょう。

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

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

26
iconoclast

POSIXとハイフン:保証なし

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

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

また、 エイリアス は有効な エイリアス名 である必要があります。

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

実装では、エイリアス名内の他の文字を拡張子として使用できます。(Emphasis mine。)

ハイフンは、どちらの場合でも許可される必要のある文字の中にされないです。したがって、これらを使用した場合、移植性は保証されません。

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

dashはデフォルトのシェル(/bin/sh)debian-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

結論

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

私はこれが本当に遅いことを知っていますが、おそらくアンダースコアをよりアクセシブルにするというあなたの問題を回避することができます。

xmodmap -e "keycode  20 =  underscore minus"

これにより、下線がハイフン(マイナス)に切り替わります。

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

キーコードは異なる場合がありますが、キーボードによって異なります。私はたまたま20です。使用する必要のあるキーコードを見つけるのにサポートが必要な場合は、私に知らせてください。

3
TuxForLife