Používám zsh
na ubuntu a vytvořil jsem symbolický odkaz pro bat
jako tak:
ln -s /usr/bin/batcat /home/user_name/.local/bin/bat
stisknutím ls -l
z ~/.local/bin
ukazuje:
lrwxrwxrwx 1 tux tux 15 May 19 13:47 bat -> /usr/bin/batcat
Nyní z libovolného adresáře (dokonce i v ~/.local/bin
),
Pokud spustím bat
, dostávám command not found: bat
. Také běží ~/.local/bin
nefunguje. Nicméně spuštěním ./bat
(z ~/.local/bin
) funguje. Spuštění batcat
také funguje.
echo $PATH
ukazuje, že ~/.local/bin
je v cestě
Co by se tu mohlo pokazit? nefunguje žádný symbolický odkaz, bat
je jen příklad
P.S. V bash věci fungují podle očekávání
Přijatá odpověď:
Pokud je vaše PATH
ve skutečnosti obsahuje ~/.local/bin
s doslovným znakem vlnovky:to nebude fungovat. Vlnovku je třeba rozšířit do vašeho domovského adresáře.
Například kterýkoli z těchto řádků je správný v zsh, bash nebo jakémkoli jiném shellu podobném 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"
Fungují, protože ~
se rozbalí do domovského adresáře, když je na začátku slova, bezprostředně za rovnítkem v přiřazení nebo bezprostředně za :
na pravé straně úkolu (účelem tohoto posledního pravidla je právě pohodlí nastavení PATH
).
Ale řádek jako PATH="~/.local/bin:$PATH"
nebude fungovat, protože ~
není rozšířen do dvojitých uvozovek, takže hodnota PATH
skončí obsahující doslovný znak ~
. Tato PATH
odkazuje na adresář s názvem ~
v aktuálním adresáři, nikoli ve vašem domovském adresáři.
Bash¹ má funkci, ve které ~
je interpretován jako domovský adresář na začátku položek cesty. Takže PATH="~/.local/bin:$PATH"
částečně funguje v bash. Funguje to však pouze tehdy, když spouštíte program přímo z bash, nikoli když programy jiné než bash samotné spouštějí programy. Takže i když používáte bash, nevkládejte doslovné ~
v cestě se ujistěte, že je rozbalená, nebo použijte $HOME
místo toho.