コマンドはzshにはありませんが、bashにはあります。

コマンドはzshにはありませんが、bashにはあります。

私は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='~'ように設計されているためです。~

おすすめ記事