Comment exécuter un alias dans un script shell?

75

J'ai un fichier exécutable mpiexec , dont le chemin complet est ~/petsc-3.2-p6/petsc-arch/bin/mpiexec . Étant donné que je veux exécuter cette commande dans différents répertoires (sans avoir à ressaisir tout le chemin), je configure un alias dans mon fichier .bashrc :

alias petsc="~/petsc-3.2-p6/petsc-arch/bin/mpiexec"  

qui me permet d’exécuter facilement ce fichier mpiexec à l’invite de commande en tapant:

petsc myexecutable

J'ai essayé d'écrire un fichier de script shell, nommé script , en utilisant mon nouvel alias petsc en tant que commande. Après avoir donné à mon script shell les autorisations appropriées (en utilisant chmod ), j'ai essayé d'exécuter le script. Cependant, cela m'a donné l'erreur suivante:

./script: line 1: petsc: command not found

Je sais que je pourrais simplement écrire le chemin complet du fichier mpiexec , mais il est fastidieux d’écrire le chemin complet à chaque fois que je veux écrire un nouveau script. Est-il possible d'utiliser mon alias petsc dans le fichier de script? Est-il possible de modifier mon .bashrc ou .bash_profile pour que cela se produise?

    
posée Paul 26.01.2012 - 19:11
la source

9 réponses

56
  1. Dans votre script shell, utilisez le chemin complet plutôt qu'un alias.

  2. Dans votre script shell, définissez une variable, une syntaxe différente

    petsc='/home/your_user/petsc-3.2-p6/petsc-arch/bin/mpiexec'
    
    $petsc myexecutable
    
  3. Utilisez une fonction dans votre script. Probablement mieux si petsc est complexe

    function petsc () {
        command 1
        command 2
    }
    
    petsc myexecutable
    
  4. Source de vos alias

    shopt -s expand_aliases
    source /home/your_user/.bashrc
    

Vous ne voulez probablement pas vous procurer votre .bashrc , alors, l’OMI, l’un des trois premiers serait meilleur.

    
réponse donnée Panther 26.01.2012 - 19:19
la source
48

Les alias sont déconseillés en faveur des fonctions shell. De la page de manuel bash :

For almost every purpose, aliases are superseded by shell functions.

Pour créer une fonction et l'exporter dans des sous-couches, placez ce qui suit dans votre ~/.bashrc :

petsc() {
    ~/petsc-3.2-p6/petsc-arch/bin/mpiexec "[email protected]"
}
export -f petsc

Ensuite, vous pouvez librement appeler votre commande depuis vos scripts.

    
réponse donnée enzotib 26.01.2012 - 19:28
la source
10

Les fonctions et alias de shell sont limités au shell et ne fonctionnent pas dans les scripts shell exécutés. Alternatives pour votre cas:

  • (si vous ne vous souciez pas d'utiliser mpiexec au lieu de petsc ) Ajoutez $HOME/petsc-3.2-p6/petsc-arch/bin à votre variable PATH . Cela peut être fait en éditant ~/.profile et en ajoutant:

    PATH="$HOME/petsc-3.2-p6/petsc-arch/bin:$PATH"
    

    Reconnectez-vous pour appliquer ces modifications

  • Créez le répertoire ~/bin et

    • créer un script wrapper nommé petsc contenant:

      #!/bin/sh
      exec ~/petsc-3.2-p6/petsc-arch/bin/mpiexec "[email protected]"
      
    • si le programme le permet, vous pouvez ignorer le script et créer un lien symbolique en utilisant la commande:

      ln -s ~/petsc-3.2-p6/petsc-arch/bin/mpiexec ~/bin/petsc
      
réponse donnée Lekensteyn 26.01.2012 - 19:52
la source
4

Dans bash 4, vous pouvez utiliser une variable spéciale: $BASH_ALIASES .

Par exemple:

$ alias foo="echo test"
$ echo ${BASH_ALIASES[foo]}
echo test
$ echo '${BASH_ALIASES[foo]}' bar
test bar

Vous pouvez également définir comme variable puis utiliser la substitution de commande ou eval .

Par exemple, au lieu de définir l’alias tel que:

alias foo="echo test"

définissez-le comme:

foo="echo test"

à la place. Ensuite, exécutez-le soit par:

find . -type f -exec sh -c "eval $foo" \;

ou:

find . -type f -exec sh -c "echo '$foo'" \;
    
réponse donnée kenorb 02.06.2015 - 00:31
la source
2

Vous pouvez mettre le code suivant dans votre .bash_aliases :

petsc() {
~/petsc-3.2-p6/petsc-arch/bin/mpiexec "[email protected]"
}

Ensuite, vous devez source .bash_aliases le fichier. Puis appelez-le: petsc arg .

Avantage: vous n'avez pas besoin du export -f petsc dans le bash_aliases .Les alias sont obsolètes mais je suppose que le simple fait d'utiliser .bash_aliases ne l'est pas.

    
réponse donnée Timo 28.03.2015 - 10:07
la source
2

Vous pouvez forcer bash à exécuter votre script en tant que shell interactif avec l'indicateur -i. Cela indiquera à votre fichier .bashrc de définir des alias et d’autres fonctions.

Exemple:

~ $ grep ll .bashrc
alias ll='ls -lah'
~ $ cat script.sh 
#!/bin/sh

ll
~ $ bash script.sh 
script.sh: line 3: ll: command not found
~ $ bash -i script.sh
..directory contents..

Plus d'infos:

$ man bash
    
réponse donnée Amado Martinez 10.01.2017 - 09:03
la source
1
  1. Utilisez vos alias dans votre script shell.
  2. Source de votre script dans votre shell interactif actuel au lieu de l’exécuter.

Donc, si vous avez un fichier appelé script.sh avec vos commandes qui incluent l'utilisation d'alias, tapez simplement:

source script.sh
    
réponse donnée Gordon Erlebacher 25.07.2016 - 02:00
la source
0

(EDIT: fonctions supprimées car j'ai mal interprété l'appel de mpiexec.)

Si la seule chose dont vous avez besoin est moins de saisie, pourquoi ne mettez-vous pas simplement le dossier dans $ PATH? Ou créez un lien symbolique vers mpiexec depuis un dossier de $ PATH? Ou (mon préféré) mettre l'alias dans un script que vous source dans le script d'appel?

    
réponse donnée unhammer 26.01.2012 - 20:22
la source
0
ALIASES
   ...
   Aliases are not expanded when the shell is not interactive, unless the expand_aliases shell option is set using shopt (see the description of shopt under SHELL BUILTIN COMMANDS
   below).

Donc, la vraie réponse à cette question, pour ceux qui cherchent à utiliser des alias réels dans des scripts shell plutôt que des alternatives à eux, est:

#!/bin/bash

shopt -s expand_aliases

alias foo=bar

foo whatever

En ce qui concerne pourquoi je voudrais faire ceci: en raison de circonstances inhabituelles, je dois amener un Dockerfile à penser qu’il s’agit d’un script shell.

    
réponse donnée Throwaway Account 3 Million 18.07.2018 - 02:50
la source

Lire d'autres questions sur les étiquettes