私のテスト(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(2010年から)またはNetBSD(2016年から)。
- busybox shはコンパイル時に選択されたシェルでは
hush
ありませんash
。 - cshとtcsh(エイリアスとして、これらのシェルには機能サポートはありません)。それにもかかわらず、これらのシェルは完全に異なる構文を持っているため、これらのシェルとのシェル間の互換性は不可能です。
- rcとデリバティブ(やはり全く異なる構文を使う)
- fish(また、まったく異なる構文を使用します)
以下は既知のシェルです。いいえ関数名のハイフンがサポートされています。
- Bourneシェルとその派生(ksh88やboshなど)(Bourneシェルでは、関数と変数は同じ名前空間を共有し、変数と関数は同じ名前を持つことはできません)
- ksh93、yash、元のash、およびいくつかの派生物(busybox ash(shのデフォルト)、ダッシュ)
結論として
- ハイフンは非標準です。シェル間の互換性が必要な場合は遠ざけてください。
- ハイフンの代わりに下線を使用してください。下線はどこでも許可されます。
答え2
本当に遅かったことは分かりますが、下線に簡単にアクセスできるように作業できます。
xmodmap -e "keycode 20 = underscore minus"
これにより、下線がハイフン(マイナス記号)に切り替わります。
ハイフンを入力するにはShiftキーを押し続けますが、下線を入力するときはShiftキーを使用する必要はありません。
あなたのキーコードはさまざまですが、あなたのキーボードによって異なる場合があります。私の考えでは、まさに20です。使用する必要があるキーコードを見つけるのに手助けが必要な場合はお知らせください。