zshのsome_variableとsome-variable

zshのsome_variableとsome-variable

なぜzshあなたは自分がしたいことが何であるかを知っているように見えsome_variable=1 commandませんかsome-variable=1 command?例:$ fs_screen=1 mpv --fs-screen=${fs_screen} someFile.mp4うまくいきますが、$ fs-screen=1 mpv --fs-screen=${fs-screen} someFile.mp4結果は次のようになります。zsh: command not found: fs-screen=1

私はzsh文書を掘り下げて問題だと思われるものを見つけました。から抜粋https://zsh.sourceforge.io/Doc/Release/Shell-Grammar.html#Precommand-Modifiers:

A simple command may be preceded by a precommand modifier, which will alter how the command is interpreted. These modifiers are shell builtin commands with the exception of nocorrect which is a reserved word.

-
The command is executed with a ‘-’ prepended to its argv[0] string.

しかし、これに関する詳細情報はどこにもありません。その目的は何であり、some-variable代わりに使用できるように無効にできますかsome_variable

ベストアンサー1

-zsh 変数名では無効であり、絶対に無効です。

  • ${var-foo}設定されていないfoo場合に拡張される Bourne シェルおよび POSIX の引数拡張演算子。$var
  • $(( var-1 ))Korn シェルと POSIX の目的は、減算演算を実行することです。

変数名の有効な文字は数字と下線であり、数字で始めることはできません。

var=1invar=1または は、コマンド引数の前に表示され、引用符のない有効な変数名が前にある</dev/null var=1 cmdため、割り当てとして認識されます。=

echo var=1, \var=1, var\=, 'v'ar=1, では、a+b=cこれらa-b=cはさまざまな理由で(コマンド引数の後、変数名の後、または参照または部分参照の後、無効な変数名)割り当てと見なされないため、通常のコマンド引数として扱われ、=実行するコマンドは次のように提供されます。最初の主張

では、fs-screen=1asはfs-screen有効なシェル変数名ではないため、割り当てとして認識されないため、コマンド引数として扱われ、最初の引数であるためコマンド名として扱われます。したがって、に組み込まれている機能、エイリアス、実行可能ファイルのリストを調べて見つから$PATHない場合は、エラーが表示されます。

以下を使用して関数を定義できますfs-screen=1

$ 'fs-screen=1'() echo hi
$ fs-screen=1
hi

(Bourne Supremacy)または:

$ function fs-screen=1 { echo hi; }
$ fs-screen=1
hi

(「コーエン」)。

またはエイリアス:

$ aliases[fs-screen=1]='echo hi'
$ fs-screen=1
hi

という名前の関数または実行可能ファイルを定義することもできますが、それを呼び出すにはvar=1変数名または変数名の一部を引用する必要があります(または実行可能=ファイルに、envまたはなどの接頭辞を追加して割り当てと見なされるものcommandに置き換えないようにする必要があります)。

$ 'var=1'() echo hi
$ var=1
$ v\ar=1
hi

zshでは、割り当ては次のようになります。

  • var[index]=value文字列の配列要素または文字に割り当てられる
  • var[first,start]=value範囲、要素、文字と同じ
  • 1=foo同じargv[1]=foo:他のBourneシェルとは異なり、位置パラメータは変数として扱うことができます。
  • var=(1 2)全体として、配列または関連配列の割り当てです。新しいバージョンには、ksh93/bash と互換性のあるassoc=( [foo]=bar )大容量の代替手段もあります。assoc=( foo bar )

5.9.x以降、zshの次のバージョンにもネームスペースがあるのでこれを行うことができますa.x=foo(しかしそうではありませんa.b.c=foo。 。次の手順を実行します(POSIXでこのコマンドを実行するa[1 + 1][4].x[foo].bar=13必要がある場合でも)。a[1

これで変数名には影響はありませんが、ほとんどのUnix系では、すべての-文字と非文字(NULを除く)も環境変数名に表示される可能性があります。=名前が空の環境変数を持つことも可能です(通常は簡単ではありませんが)。

ただし、数字やアンダースコア以外の文字を含む、数字で始まる、またはzshが環境から取得されないリストにあるもの(シェル変数にマップすることはできませんIFS):USERNAME

$ env $'a\nb-c'=123 printenv $'a\nb-c'
123

(これは改行文字ではなく環境変数名です-。)

perlあなたが好きまたはpython3アクセスできる言語:

$ env $'a\nb-c'=123 perl -le 'print $ENV{"a\nb-c"}'
123
$ env $'a\nb-c'=123 python3 -c 'import os; print(os.getenv("a\nb-c"))'
123

しかし、zsh環境変数にアクセスする方法は、独自の変数へのマッピングによって行われるため、他のBourneに似たシェルも同様です。

$ env a-b=1 a_b=2 zsh -c 'echo ${parameters[a-b]-notfound} ${parameters[a_b]-notfound}; printenv a-b'
notfound scalar-export
1

a_b$a_bスカラー(配列または関連ではない)シェル変数にマップされ、export環境で提供される属性を提供しますが、マップされa-bません。 zshはそれをまだ環境に保持しているので、実行しているコマンド(たとえばprintenv上記のような)に渡されます。一部の他のシェルはmksh環境から削除することを好む。


¹以前のポイントでなければ、orを引数として${var-name}使用できるかのようにそこで使用できると主張することもできます。それ以外の場合は算術演算子でもあります(、もちろん、...と同じ)。変数。変数のポイントは、値を割り当てることができるということであり、置き換えることはできますが、算術式が評価される前に拡張されるため、そうすることはできません。$(( $! - 1 ))$(( ${!} - 1 ))$!!$?$*$#$1$2$(( $var ))$(( var ))$(( $var = 1+1 ))$(( var = 1+1 ))$var

おすすめ記事