揺れるダッシュ(チルダ、〜)はどのような言語構造ですか?

揺れるダッシュ(チルダ、〜)はどのような言語構造ですか?

ホームディレクトリの代わりにスイングダッシュを使用できます。現在のユーザーによって値が異なります。この意味では変数と同じです。

しかし、変数ではありません。私はそれをすることはできませんが、echo $~私はそれをすることができますecho ~

どのような言語構造ですか?

答え1

チルダ( ~)が引用符なしで単独で、またはユーザー名の接頭辞として表示される場合チルダ拡張。これはシェルによって行われた単語拡張の1つです。性格これは、プログラムを構成し、パラメーター拡張前に発生する構文表示です。 ㅏ言葉シェル入力(コマンドラインのスクリプトやコマンドなど)のトークンですが、まだ認識されていません。予約語if、または、doまたはオペレーター||わかりました&&

これは、場合によっては、チルダが変数ではなく、チルダ拡張フェーズでシェルに具体的に属する単語を処理する文字であることを意味します。これは、現在の単語を他の拡張タイプの候補としてマークする$のと似ています。$

これは定義されていますPOSIX経由(これは実際に拡張が発生したときに説明したよりも少し慎重です。)

2.6.1 チルダの拡張

「チルダプレフィックス」は、単語<tilde>の先頭に引用符が含まれていない文字で構成され、その後に<slash>単語に引用符が含まれていない最初の文字の前のすべての文字が続き、それ以外の場合は単語のすべての文字が続きます<slash>。割り当て(XBD変数の割り当てを参照)では、単語の先頭(つまり、割り当て<equals-sign>の後)、引用符なしの文字の後、またはその両方<colon>に複数のチルダプレフィックスを使用できます。課題のチルダプレフィックスは、引用符のない最初または<colon>で終わります<slash>。チルダプレフィックスに引用符が付けられていない文字がある場合、チルダプレフィックスの後の文字は<tilde>ユーザーデータベースで可能なログインとして扱われます。ポータブルログイン名には、LOGNAMEXBDその他の環境変数の環境変数の説明で指定されている文字セット以外の文字を含めることはできません。ログイン名が空の場合(つまり、チルダプレフィックスにチルダのみが含まれている場合)、チルダプレフィックスは変数の値に置き換えられますHOME。設定しないとHOME結果は指定されません。それ以外の場合は、チルダプレフィックスをgetpwnam()POSIX.1-2017システムインタフェースボリュームで定義されている関数を使用して取得したログインに関連付けられた初期作業ディレクトリのパス名に置き換える必要があります。システムがログイン名を認識しない場合、結果は定義されません。

チルダ拡張で生成されたパス名は、フィールドの分割とパス名の拡張による変更を防ぐために引用符で囲む必要があります。

答え2

私は@Kusalanandaと@stéphane-chazelasの意見に基づいてこの質問に直接答えたいと思います。

シェルはコマンドラインソルバーです。入力トークンを厳密に入力しません。治療は特定の状況によって異なります。 2つの合理的な答えがあります。

回答1

シェルへの入力を解釈する際に入力がないため、チルダはまったく「一部の言語構成」ではありません。コンテキストに従って入力を動的に処理します。

回答2

チルダタイプは仮想タイプの「パス」に最も近い。一般的な状況では、変数に似た属性を持つホームディレクトリに展開されますが、そうではありません。

回答1の根拠

Bash にはフロー制御トークンも入力されません。

echo while

これは間違いではありません。この場合、「while」のみを印刷します。

チルダは状況によって異なって扱われます。通常、ユーザーのホームディレクトリに展開されます。

echo ~

それ以外の場合は拡張されません。

echo "~"
echo ~~

回答2の根拠

POSIX 定義は、引用されていないチルダを「単語」として扱います。通常、シェルによってホームディレクトリに展開されます。今後シェル自体でパスとして使用される前、または他のプログラムに引数として提供される前に使用されます。

実行可能ファイルのパスとして使用:

~/bin/myprogram

引数のパスとして使用されます。

ls ~

引数として渡す前にホームディレクトリに展開してもパスである必要はありません。

echo ~

同様に、一般的なユースケースでは、シェルで引用されていない単語がパスとして使用され、引用された単語が文字列引数として使用されます。実行可能ファイルへの各呼び出しは$ PATHに基づいています。ファイルシステムのパスに基づいて単語を展開するにはクリックしてください。

**要約**

非定型的な方法でシェルを使用できます。たとえば、実行可能ファイルへのパスとして引用された文字列を使用できます。

"echo" echo 

このプリントはエコです。引用符付き文字と引用符付き文字の一般的な使用法は逆です。

回答2の理論的根拠は、実際のタイプではなく慣習に基づいています。シェルのアーキテクチャは動的アーキテクチャです。

関連情報