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

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

私のテスト(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のデフォルト)、ダッシュ)

結論として

  • ハイフンは非標準です。シェル間の互換性が必要な場合は遠ざけてください。
  • ハイフンの代わりに下線を使用してください。下線はどこでも許可されます。

おすすめ記事