エイリアスに許可される文字

エイリアスに許可される文字

在庫標準は、エイリアスを含む次のように動作します。zsh例:-a-a

% zsh -f
svelte% alias a-a=date
svelte% a-a
Sun 19 Jul 2020 17:20:05 +07

私の設定は次のように動作します。

% alias a-a=date       
% alias | grep a-a
a-a=date
% a-a
zsh: command not found: a-a

ハイフンのないエイリアスはうまく機能します。

zshハイフンという名前のエイリアスが見つからないようにするオプションは何ですか?

答え1

"&');<>`|このオプションを設定すると、zshはジョブエイリアスに許可されていないデフォルトの10文字に加えてposixaliases12文字を追加します。

#$(*-?[\]^{~

これにはダッシュが含まれ、-ダッシュなしで機能しますposixaliases

エイリアスオプション

エイリアスに影響を与える zsh にはいくつかのオプションがあります。

ALIASES ALIAS_FUNC_DEF POSIX_ALIASES

このaliasesオプションは、制御のみのオプションとは異なり、すべて有効またはまったく有効ではありませんa-b

これはaliasfuncdef、関数定義を解析する方法とより関連しています。

サフィックスエイリアス

だから試すべき唯一のことはposixaliases。その男の説明はこうです。

このオプションが設定されている場合、予約語はエイリアス拡張の候補ではありません。

この問題には適用されないようです。

POSIX 定義エイリアス

しかし知っているのはPOSIXの説明aliasは次のとおりです。:

3.10 エイリアス

シェルコマンド言語では、下線、数字、移植可能な文字セットの文字と「!」、「%」、「、」、「@」の文字で構成される単語です。

実装では、エイリアスの追加文字を拡張子として受け入れることができます。

つまり、POSIXの場合、使用可能な文字のリストはです_0-9a-zA-Z!%,@。拡張として許可されていても、
説明にはダッシュは含まれません。-

したがって、aはややposix_alias制限的かもしれません。実はそうです。alias

エイリアスに許可される文字

一般的に、有効な文字のリストは多少alias曖昧で、見つけるのが難しいです。実際にはすべてのUnicode文字を受け入れているようです。

% for  c in ä å é ë þ ü ú í ó ö á ß ð f g h ï œ ø ¶ æ œ © ® b ñ µ ç;
> do   d=a${c}b; 
>      alias $d="echo alias $d";
> done
% alias
a©b='echo alias a©b'
a®b='echo alias a®b'
aµb='echo alias aµb'
a¶b='echo alias a¶b'
aáb='echo alias aáb'
aßb='echo alias aßb'
aäb='echo alias aäb'
aåb='echo alias aåb'
aæb='echo alias aæb'
açb='echo alias açb'
aéb='echo alias aéb'
aëb='echo alias aëb'
aíb='echo alias aíb'
aïb='echo alias aïb'
aðb='echo alias aðb'
añb='echo alias añb'
aób='echo alias aób'
aöb='echo alias aöb'
aøb='echo alias aøb'

ただし、zsh は ASCII 文字を使用するとさらに制限されます。

% for c in ! @ % +; do d=a${c}b; alias $d="echo alias $d"; done

ただし、a!bとして引用されている場合にのみ機能し、a\!b一部の文字は# $ ^ *簡単には使用できません(上記では使用されていません)。

実際には、{\ ..~}ASCII リスト全体をテストしてエイリアスを定義することが可能です。

for c in {\ ..~}; do d="a${c}b"; alias $d="echo alias ${(q)d}";done

ただし、一部のエイリアスだけが実際に動作します。

for c in {\ ..~}; do d="a${c}b"; if e=$(eval $d) 2>/dev/null; then print $d $e; else print "failed char: $c"; fi; done

10個の失敗した文字が表示されます。"&');<>`|一部の構文文字はエイリアスとして定義できますが、機能しません(引用符を除く)。一部の文字はファイルシステムから取得されたパターン文字で<=>&;あり、一部のエイリアスは誤って定義されています。[?引用しない文字: \`$#

POSIXエイリアスでは、「引用符のない一般文字」のみが有効です。 zshは、上記のテストでposixaliases12個の追加文字が直接表示されるように必須定義を設定します。failed chars

#$(*-?[\]^{~

これらの文字はジョブエイリアスには使用できません。その中には-問題の原因もあります。

メモman zsh:

POSIX_ALIASESが設定されている場合、引用符のない一般的な文字列だけがエイリアスに適しています。組み込みエイリアスは正規化されていないエイリアスを拒否しませんが、拡張しません。

答え2

簡単な答えはsetopt aliases(言及していないかのようにハイフンのないエイリアスは機能し続けますか)です。

それほど単純ではない問題 - このような対話型行を「aマイナスa」として扱うことができる数学/計算サードパーティのプラグインをロードしていませんか?

明らかに大きくて複雑な設定(誰がそうではないか...)があるので、まずすべての外部コード(zsh-loversトリックなど)を無効にします。これは、zshオプション自体ではなく、干渉の原因である可能性が最も高いためです。

関連情報