web-dev-qa-db-ja.com

この場合、チルダがホームフォルダとして認識されないのはなぜですか?

これは機能しません:

$ ls "~/.wine/drive_c/tools/Family Tree v2.0"
ls: cannot access '~/.wine/drive_c/tools/Family Tree v2.0': No such file or directory

しかし、これは:

$ ls "/home/daniel/.wine/drive_c/tools/Family Tree v2.0"
Dossiers                           Dossiers_orig   Infos.opt      Racines.exe  'Register OCX.bat'   racines.CNT
Dossiers-2019.11.03-11.46.tar.gz   Html            REGSVR32.exe   Racines.hlp   Uninst.isu          readme.txt

~/home/danielと同じであると仮定すると、ここで何が起こっているのでしょうか。

19
Gigi

引用符は、二重引用符が付いていても、チルド展開を抑制します。

~は、 チルダ展開 が実行されるコンテキストで使用できます ホームディレクトリへのパスとして~.または.. とは異なります。実際には、ホームディレクトリの代替名として機能する~という名前のエントリがファイルシステムにありません。

~が単独で、またはパスの最初のコンポーネントとして表示される場合、シェルはそれを 絶対パス に展開してホームディレクトリにします。しかし、これは~が引用されている場合には起こりません。 二重引用符一重引用符 よりも弱い形式の 引用 を提供します。これは、他の種類の 展開 にとって重要です、 パラメータ展開$HOMEを展開する)など。しかし、二重引用符でさえもチルド展開を抑制します。

したがって、このコマンドでは~は展開されておらず、引用されています。

ls "~/.wine/drive_c/tools/Family Tree v2.0"

幸いなことに、一部が引用されている部分と引用されていない部分がある引数を書き込むことができます。したがって、引用符の前に~/を付けても、残りを引用できます。

ls ~/".wine/drive_c/tools/Family Tree v2.0"

または、パラメーターの展開は二重引用符内でも実行されますが、単一引用符内では実行されないため、以下を使用できます。

ls "$HOME/.wine/drive_c/tools/Family Tree v2.0"

(技術的には異なります。つまり、HOME環境変数が設定されていなくても、一部のシェルはホームディレクトリが何であるかを理解し、~bashはそのようなシェルの1つですが、HOMEを設定解除することはまれであり、お勧めできません。


参考文献:

51
Eliah Kagan