web-dev-qa-db-fra.com

Comment exécuter un alias dans un script Shell?

J'ai un fichier exécutable mpiexecname__, dont le chemin complet est ~/petsc-3.2-p6/petsc-Arch/bin/mpiexec. Puisque je veux exécuter cette commande dans différents répertoires (sans avoir à ressaisir le chemin complet), j'ai créé un alias dans mon fichier home .bashrc:

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

ce 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é scriptname__, en utilisant mon nouvel alias petscen tant que commande. Après avoir donné les autorisations appropriées à mon script Shell (à l'aide de chmodname__), j'ai tenté 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 d'accès complet au fichier mpiexecname__, mais il est fastidieux d'écrire le chemin d'accès complet à chaque fois que je souhaite écrire un nouveau script. Est-il possible d'utiliser mon alias petscdans le fichier de script? Est-il possible de modifier mon .bashrc ou .bash_profile pour que cela se produise?

92
Paul
  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 vos alias

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

Vous ne voulez probablement pas trouver votre .bashrc, alors, IMO, l’un des 3 premiers serait préférable.

67
Panther

Les alias sont déconseillés en faveur des fonctions Shell. Depuis 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-shell, indiquez ce qui suit dans votre ~/.bashrc:

petsc() {
    ~/petsc-3.2-p6/petsc-Arch/bin/mpiexec "$@"
}
export -f petsc

Ensuite, vous pouvez librement appeler votre commande à partir de vos scripts.

55
enzotib

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

  • (Si vous ne vous souciez pas d'utiliser mpiexecau lieu de petscname__) Ajoutez $HOME/petsc-3.2-p6/petsc-Arch/bin à votre variable PATHname__. Cela peut être fait en éditant ~/.profile et en ajoutant:

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

    Se reconnecter pour appliquer ces changements

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

    • créez un script wrapper nommé petsccontenant:

      #!/bin/sh
      exec ~/petsc-3.2-p6/petsc-Arch/bin/mpiexec "$@"
      
    • si le programme le permet, vous pouvez ignorer le shellscript et créer un lien symbolique à l'aide de la commande suivante:

      ln -s ~/petsc-3.2-p6/petsc-Arch/bin/mpiexec ~/bin/petsc
      
12
Lekensteyn

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 en tant que variable, puis utiliser la substitution de commande ou eval.

Ainsi, par exemple, au lieu de définir un alias tel que:

alias foo="echo test"

le définir comme:

foo="echo test"

au lieu. Puis exécutez-le soit:

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

ou:

find . -type f -exec sh -c "echo `$foo`" \;
8
kenorb
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 au lieu de leurs alternatives, est la suivante:

#!/bin/bash

shopt -s expand_aliases

alias foo=bar

foo whatever

En ce qui concerne pourquoi J'aimerais faire ceci: En raison de circonstances inhabituelles, je dois tromper un fichier Dockerfile en lui faisant croire que c'est un script Shell.

4
Throw Away Account
  1. Dans .bash_aliases:

    petsc {
    ~/petsc-3.2-p6/petsc-Arch/bin/mpiexec "$@"
    }
    

    Ou mettez la fonction dans .bashrc. Généralement, dans .bashrc, seuls les paramètres de configuration de bash sont stockés.

  2. Dans le terminal: source .bash_aliases

  3. Appelez-le: petsc arg(s)

Avantage: vous n'avez pas besoin de export -f petscin .bash_aliases. Les alias sont obsolètes, mais utiliser .bash_aliases pour les fonctions est correct.

4
Timo

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'informations:

$ man bash
4
Amado Martinez
  1. Utilisez vos alias dans votre script Shell.
  2. Sourcez 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 incluant l’utilisation d’alias, tapez simplement:

source script.sh
2
Gordon Erlebacher

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

Si la seule chose dont vous avez besoin est de moins taper, pourquoi ne pas simplement placer le dossier dans $ PATH? Ou créer 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?

1
unhammer