2017-06-06 6 views
1

J'utilise mac et j'ai:Pourquoi bash alias ne fonctionne pas dans les scripts?

$cat .bashrc|grep la 
alias la='ls -la' 

alors j'essayé de l'utiliser dans un script:

$cat ./mytest.sh 
#!/bin/bash 
la 

Il court et dire qu'il ne peut pas trouver la:

./mytest.sh: line 2: la: command not found 

Pourquoi est-ce? J'ai essayé sur Mac et Linux, même erreur!

+2

@anubhava: « sous-shell » est un terme d'art qui ne semble pas appliquer ici. Je suppose que vous voulez dire quelque chose comme des «scripts shell invoqués», mais dans ce cas, vous décrivez simplement le comportement observé par l'OP, plutôt que de l'expliquer. – ruakh

+0

L'utilisation d'alias dans un script n'est pas une bonne pratique. Utilisez des fonctions à la place. De même, rendre les scripts dépendants de '.bashrc' n'est pas idéal non plus. Voir ce post: https://unix.stackexchange.com/questions/1496/why-doesnt-my-bash-script-recognize-aliases – codeforester

+0

Copie possible de: https://stackoverflow.com/questions/30130954/alias- doesnt-travail-dans-un-bash-script – codeforester

Répondre

6

Votre .bashrc n'est utilisé que par des obus interactifs. https://www.gnu.org/software/bash/manual/bashref.html#Bash-Startup-Files dit:

Invoked non-interactively

When Bash is started non-interactively, to run a shell script, for example, it looks for the variable BASH_ENV in the environment, expands its value if it appears there, and uses the expanded value as the name of a file to read and execute. Bash behaves as if the following command were executed:

if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi 

but the value of the PATH variable is not used to search for the filename.

As noted above, if a non-interactive shell is invoked with the --login option, Bash attempts to read and execute commands from the login shell startup files.

Comme vous pouvez le voir, il n'y a rien .bashrc là. Votre alias n'existe tout simplement pas dans le script.


Mais même si .bashrc ont été lus, il y a another problem:

Aliases are not expanded when the shell is not interactive, unless the expand_aliases shell option is set using shopt .

Donc, si vous vouliez des alias pour travailler dans un script, vous auriez à faire shopt -s expand_aliases d'abord. Ou utilisez simplement une fonction shell au lieu d'un alias.

1

Au début du fichier ~/.bashrc se trouve généralement deux lignes comme:

# If not running interactively, don't do anything 
[ -z "$PS1" ] && return 

Cette ligne interrompt l'inclusion des scripts qui n'est pas recommandé de toute façon. Pour les problèmes de portabilité, vous écrivez généralement la commande complète ou définissez l'alias dans le script lui-même.

1

La réponse la plus simple est de résoudre ce problème est de faire les 2 choses importantes dans votre script -ou ça ne marchera pas, si vous faites juste une chose.

#!/bin/bash -i 

# Expand aliases defined in the shell ~/.bashrc 
shopt -s expand_aliases 

Après cela, vos alias que vous avez définis dans ~/.bashrc ils seront disponibles dans votre script shell (ou giga.sh any.sh) et à toute coquille de fonction ou enfant dans ce script.

Si vous ne le faites pas, vous obtiendrez une erreur:

your_cool_alias: command not found