
私のテスト (Bash および Z Shell) では、名前にハイフンが含まれる関数やエイリアス、実行可能なシェル スクリプトの定義に問題は見られませんでしたが、すべてのシェルおよびすべてのユース ケースでこれが問題ないかどうかはわかりません。
これを実行する理由は、ハイフンの方がアンダースコアよりも入力が簡単で、したがってより速くスムーズに入力できるからです。
これが問題ではないと信じるのをためらう理由の 1 つは、一部の言語 (たとえば Ruby) では、ハイフンはスペースがなくてもマイナス記号として解釈されるからです。一部のシェルでは、スペースがなくてもハイフンがオプションを示すものとして解釈されるので、このようなことが起きても驚きません。
私が少し疑っているもう 1 つの理由は、テキスト エディターがハイフンを含む関数の構文強調表示を台無しにしてしまうことです。(もちろん、これはシェル スクリプトの構文強調表示設定のバグである可能性も十分にあります。)
ハイフンを避けるべき理由はありますか?
答え1
POSIX とハイフン: 保証なし
POSIX標準によれば、関数名有効な名前でなければならず、名前構成は次のとおりです:
3.231 名前
シェル コマンド言語では、アンダースコア、数字、およびポータブル文字セットのアルファベットのみで構成される単語。名前の最初の文字は数字ではありません。
さらに、別名有効である必要があります別名、これは次のものから構成されます:
3.10 エイリアス名
シェル コマンド言語では、ポータブル文字セットのアンダースコア、数字、アルファベットと、次の文字のいずれかのみで構成される単語: '!'、'%'、','、'@'。実装では、拡張機能としてエイリアス名内に他の文字を許可する場合があります。 (強調は私によるものです。)
ハイフンはないどちらの場合でも許可する必要がある文字の中にリストされています。したがって、これらを使用すると移植性が保証されません。
ハイフンをサポートしないシェルの例
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 シェル (ash ベースのもののみ) も関数名にハイフンをサポートしていません。
$ a-b() { date; }
-sh: Syntax error: Bad function name
シェルによるハイフンのサポートの概要
次のシェルは関数名にハイフンをサポートしていることが知られています。
- pdksh および派生言語、bash、zsh
- FreeBSDのshのようなash派生言語(2010年以降) または NetBSD (2016 年以降)。
- コンパイル時に選択されたシェルが の場合、busybox sh
hush
の代わりにが使用されますash
。 - csh および tcsh (これらのシェルのエイリアスでは、関数はサポートされていません)。いずれにしても、これらのシェルの構文は根本的に異なるため、シェル間の互換性は期待できません。
- rc とその派生語 (これも根本的に異なる構文)
- fish (これもまた根本的に異なる構文)
以下の貝殻が知られているない関数名にハイフンをサポートするには:
- Bourne シェルと、ksh88 や bosh などの派生版 (Bourne シェルでは、関数と変数は同じ名前空間を共有するため、同じ名前の変数と関数を持つことはできませんでした)。
- ksh93、yash、オリジナルのashとその派生版(busybox ash(shのデフォルト選択)、dash)
結論
- ハイフンは非標準です。シェル間の互換性が必要な場合はハイフンを使用しないでください。
- ハイフンの代わりにアンダースコアを使用します。アンダースコアはどこでも使用できます。
答え2
本当に遅いとは思いますが、アンダースコアをよりアクセスしやすくするという問題を回避できるかもしれません。
xmodmap -e "keycode 20 = underscore minus"
これにより、アンダースコアがハイフン (マイナス) に切り替わります。
つまり、ハイフンを入力するには Shift キーを押しますが、アンダースコアは Shift キーなしで入力します。
キーコードは異なる場合がありますが、キーボードによって異なると思います。私のキーコードは 20 です。使用する必要があるキーコードを見つけるのにサポートが必要な場合は、お知らせください。