
私はUbuntuにいて、次のzsh
ようなシンボリックリンクを作成しましたbat
。
ln -s /usr/bin/batcat /home/user_name/.local/bin/bat
パフォーマンスls -l
ヒット~/.local/bin
:
lrwxrwxrwx 1 tux tux 15 May 19 13:47 bat -> /usr/bin/batcat
今、すべてのディレクトリで(私でも~/.local/bin
)、
私が走るとbat
私はそれを得るでしょうcommand not found: bat
。実行~/.local/bin
も機能しません。ただし、./bat
(で~/.local/bin
)を実行すると機能します。走りbatcat
も効果があります。
echo $PATH
~/.local/bin
パスに表示
ここで何が間違っている可能性がありますか?シンボリックリンクは機能しません。bat
単なる例です。
PS bashでは、すべてが期待どおりに動作します。
答え1
PATH
実際には、リテラルチルダ文字を含めると~/.local/bin
機能しません。チルダをホームディレクトリに展開する必要があります。
たとえば、次の行は、zsh、bash、または他のshに似たシェルで正確です。
PATH=~/.local/bin:$PATH
PATH=$PATH:~/.local/bin
PATH=~/.local/bin:"$PATH"
PATH="$PATH":~/.local/bin
export PATH="$HOME/.local/bin:$PATH"
export PATH="$PATH:$HOME/.local/bin"
~
単語の先頭、割り当てステートメントなどの記号の後、または割り当てステートメントの右後に来ると、ホームディレクトリに展開されるために機能します(この最後のルールは設定を簡単にするためのものです)。:
PATH
ただし、このような行はPATH="~/.local/bin:$PATH"
二重引用符で拡張されないため、機能しません。したがって、最終~
値にはリテラル文字が含まれます。これは、ホームディレクトリではなく現在のディレクトリ内の呼び出しディレクトリを表します。PATH
~
PATH
~
~
Bash1には、パスエントリの先頭をホームディレクトリとして解釈する機能があります。 bashでもPATH="~/.local/bin:$PATH"
部分的に機能します。ただし、これは bash の外部でプログラム自体を起動するのではなく、 bash から直接プログラムを実行する場合にのみ機能します。したがって、bashを使用しても~
パスにリテラルを入れないでください。拡張または使用されていることを確認してください$HOME
。
sh
この機能は、POSIXモードでない場合(たとえば、aで実行されている場合)、POSIXコンプライアンスを破ります。これは、現在の作業ディレクトリのリテラルサブディレクトリでコマンドを見つけるPATH='~'
ように設計されているためです。~