
bashマニュアルのチルダ拡張について:
もし一言引用符のないチルダ文字(「〜」)で始まり、引用符のない最初のスラッシュまでのすべての文字(または引用符なしのスラッシュがない場合はすべての文字)は、チルダプレフィックスとして扱われます。
~
なぜチルダプレフィックスとして認識されるのか知りたいです。
$ mypath=/program_files:~/home/t
$ echo $mypath
/program_files:/home/t/home/t
mypath=/program_files:~/home/t
bashの語彙アナライザはどの単語を何に分割しますか?~/home/t
言葉で正確に認識されますか?
bashの語彙アナライザは、コマンドを単語に分割するためにどの単語区切り文字を使用しますか?単語区切り記号:
ですか=
?それも言いますか?
ありがとうございます。
これは私の理解力の欠如から始まります。https://unix.stackexchange.com/a/448469/674
PATH文字列内のチルダ文字を理解できません。これが、POSIX標準でシェルマクロを割り当てるときにコマンドラインでコロンの後にチルダシーケンスを拡張する必要がある理由です。
答え1
これは単語分割(より正確にはトークン分割)の結果ではありませんが、チルダ拡張変数の割り当てでは:
各変数の割り当ては、「:」または最初の「=」の直後に引用符で囲まれていないチルダプレフィックスがあることを確認します。そのような場合、チルダ拡張も実行されます。
Bashがコマンドをトークンに分割するときにBashが使用する単語区切り文字は、メタ文字:
引用符がない場合、単語を区切るために使用される文字です。メタ文字は、スペース、タブ、改行、または「|」、「&」、「;」、「(」、「)」、「<」または「>」文字のいずれかです。
mypath=/program_files:~/home/t
Bashの観点から見ると、これは単一のタグです。
答え2
PATH
チルダは変数割り当てであり、チルダは引用符で囲まれていないコロンの直後にあるため、割り当てから拡張されます(あなたの例では)。
「チルダプレフィックス」は、単語
<tilde>
の先頭に引用符が含まれていない文字で構成され、その後に<slash>
単語に引用符が含まれていない最初の文字の前のすべての文字が続き、それ以外の場合は単語のすべての文字が続きます<slash>
。割り当て(XBD変数の割り当てを参照)では、複数のチルダプレフィックスを使用できます。単語の先頭(つまり、<equals-sign>
割り当ての後)に引用されていないものに<colon>
、または両方。
マニュアルにはbash
こんな感じです。
各変数の割り当ては、
:
aまたはfirstの直後に引用符が付いていないチルダプレフィックスがあることを確認します=
。そのような場合、チルダ拡張も実行されます。そのため、割り当てにはチルダファイル名を使用でき、PATH
シェルMAILPATH
はCDPATH
拡張値を割り当てます。
つまり、引用符で囲まれていない文字列を文字列/program_files:~/home/t
に割り当てるPATH
と、その中にチルダが展開され、これはチルダが拡張文字列に$PATH
なります。
リテラルチルダを入力するとPATH
(たとえば、文字列を引用して)、そのディレクトリのコマンドパス名の解決は失敗します(そのリテラル名を持つディレクトリが現在の作業ディレクトリに存在しない限り)。
bash
PATH
POSIX モードでない場合でも、コマンドが見つかるとチルダは引き続き拡張されます。
シェルがラインをスキャンするとき
mypath=/program_files:~/home/t
これは単一のトークンとしてパーサーに返されます。単純なコマンドで処理されます。
単純なコマンドは、割り当てとして認識されると、チルダの拡張などを受けます。右にチルダ拡張を実行すると、=
シェルは文字列のチルダがコロンの後に表示されるため、現在のユーザーのホームディレクトリに展開します。
また、見ることができます簡単なコマンドのためのPOSIXテキスト。