V mém ~/.bashrc
soubor obsahuje dvě definice:
commandA
, což je alias delší cestycommandB
, což je alias skriptu BashChci zpracovat stejný soubor s těmito dvěma příkazy, takže jsem napsal následující skript Bash:
#!/bin/bash
for file in "[email protected]"
do
commandA $file
commandB $file
done
Dokonce i po odhlášení z mé relace a přihlášení zpět, Bash mě vyzve s command not found
chyby pro oba příkazy, když spustím tento skript.
Co dělám špatně?
Za prvé, jak řekl ddeimeke, aliasy se ve výchozím nastavení nerozšiřují v neinteraktivních skořápkách.
Druhý, .bashrc
není čteno neinteraktivními skořápkami, pokud nenastavíte BASH_ENV
proměnná prostředí.
Ale co je nejdůležitější: nedělejte to! Prosím? Jednoho dne přesunete tento skript někam, kde nejsou nastaveny potřebné aliasy, a znovu se rozbije.
Místo toho nastavte a použijte proměnné prostředí jako zkratky ve skriptu:
#!/bin/bash
CMDA=/path/to/gizmo
CMDB=/path/to/huzzah.sh
for file in "[email protected]"
do
$CMDA "$file"
$CMDB "$file"
done
Když se podíváte na bashovou stránku, najdete:
Aliasy se nerozbalí, když Shell není interaktivní, pokud není nastavena možnost expand_aliases Shell pomocí shopt (viz popis shopt v Shell BUILTIN COMMANDS níže).
Takže dejte
shopt -s expand_aliases
ve vašem skriptu.
Nezapomeňte po nastavení ve skriptu vytvořit zdrojový soubor s aliasy.
shopt -s expand_aliases
source ~/.bash_aliases
Aliasy nelze exportovat, takže nejsou dostupné ve skriptech Shell, ve kterých nejsou definovány. Jinými slovy, pokud je definujete v ~/.bashrc
nejsou k dispozici your_script.sh
(pokud nemáte zdroj ~/.bashrc
ve skriptu, který bych nedoporučoval, ale existují způsoby, jak to udělat správně).
Funkce však lze exportovat a byly by dostupné skriptům Shell, které jsou spouštěny z prostředí, ve kterém jsou definovány. To lze provést umístěním do vašeho bashrc:
foo () { echo "Ahoj svět!" } export -f foo
Jak uvádí příručka Bash: „Téměř pro všechny účely jsou funkce Shell preferovány před aliasy.“
[cmd line] > bash -i [your script's file path]
i
je pro interaktivní a zdroje vašeho bash
profilu pro vás.