GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Befehl nicht in Zsh, aber in Bash gefunden?

Ich verwende zsh auf Ubuntu und ich habe einen Symlink für bat erstellt also:

ln -s /usr/bin/batcat /home/user_name/.local/bin/bat

Drücken Sie ls -l aus ~/.local/bin zeigt:

lrwxrwxrwx 1 tux tux 15 May 19 13:47 bat -> /usr/bin/batcat

Jetzt aus jedem Verzeichnis (sogar in ~/.local/bin ),

Wenn ich bat ausführe , erhalte ich command not found: bat . Läuft auch ~/.local/bin funktioniert nicht. Wenn Sie jedoch ./bat ausführen (aus ~/.local/bin ) funktioniert. Ausführen von batcat geht auch.

echo $PATH zeigt, dass ~/.local/bin befindet sich im Pfad

Was könnte hier schief laufen? Kein Symlink funktioniert, bat ist nur ein Beispiel

P.S. In Bash funktionieren die Dinge wie erwartet

Akzeptierte Antwort:

Wenn Ihr PATH enthält tatsächlich ~/.local/bin mit dem wörtlichen Tilde-Zeichen:das wird nicht funktionieren. Die Tilde muss in Ihr Home-Verzeichnis expandiert werden.

Zum Beispiel ist jede dieser Zeilen in zsh, bash oder jeder anderen sh-ähnlichen Shell korrekt:

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"

Sie funktionieren, weil ~ wird in das Home-Verzeichnis expandiert, wenn es am Anfang eines Wortes steht, unmittelbar nach dem Gleichheitszeichen in einer Zuweisung oder unmittelbar nach einem : auf der rechten Seite einer Zuweisung (der Zweck dieser letzten Regel besteht genau darin, PATH bequem zu setzen ).

Aber eine Zeile wie PATH="~/.local/bin:$PATH" funktioniert nicht, weil ~ wird nicht in doppelte Anführungszeichen erweitert, also der Wert von PATH enthält am Ende das Literalzeichen ~ . Dieser PATH verweist auf ein Verzeichnis namens ~ im aktuellen Verzeichnis, nicht in Ihrem Home-Verzeichnis.

Bash¹ hat eine Funktion, in der ~ wird am Beginn von Pfadangaben als Heimatverzeichnis interpretiert. Also PATH="~/.local/bin:$PATH" funktioniert teilweise in bash. Es funktioniert jedoch nur, wenn Sie ein Programm direkt von Bash aus ausführen, nicht, wenn andere Programme als Bash selbst Programme starten. Auch wenn Sie bash verwenden, geben Sie also keinen wörtlichen ~ ein Stellen Sie im Pfad sicher, dass er erweitert ist, oder verwenden Sie $HOME stattdessen.


Linux
  1. [Behoben] bash:sudo:Befehl nicht gefunden

  2. Sudo:Nocorrect:Befehl nicht gefunden?

  3. ifrename:Befehl nicht gefunden

  4. ln:Befehl nicht gefunden

  5. Was ist -bash:!:Ereignis nicht gefunden

Fehlerbehebung „Bash:Command Not Found“-Fehler in Linux

aws-shell:Befehl nicht gefunden

rm:Befehl nicht gefunden

mv:Befehl nicht gefunden

bash sh - Befehl nicht gefunden

bash - make-Befehl nicht gefunden