it-swarm-eu.dev

Proč můj skript Bash nerozpozná aliasy?

V mém ~/.bashrc soubor obsahuje dvě definice:

  1. commandA, což je alias delší cesty
  2. commandB, což je alias skriptu Bash

Chci 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ě?

237
Zaid

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
125
user601

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
175
ddeimeke

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.

11
user65576