Question Comment exécuter un alias dans un script shell?


J'ai un fichier exécutable mpiexec, 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), je configure un alias chez moi .bashrc fichier:

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

ce qui me permet d'exécuter ceci mpiexec fichier à l'invite de commande facilement 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é de lancer 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 vers le mpiexec fichier, 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?


76
2018-01-26 18:11


origine


Que diriez-vous d'ajouter l'alias à .bash_aliases ? Aussi, que diriez-vous d'aliaser le chemin absolu au lieu d'un chemin relatif comme alias petsc='/home/user/petsc-3.2-p6/petsc-arch/bin/mpiexec' - Nitin Venkatesh
@nitstorm: Ni la solution ne semble fonctionner ... Je reçois toujours la même erreur qu'auparavant - Paul


Réponses:


  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.


58
2018-01-26 18:19



Le point 4 ne fonctionne pas, sauf si vous utilisez shopt -s expand_aliases dans le même script. - enzotib
Votre suggestion 2) fonctionne, mais je veux pouvoir utiliser la même commande dans plusieurs scripts shell sans avoir à écrire la première ligne petsc = "...". Y a-t-il un moyen de faire cela? - Paul
Sonne comme si vous deviez mettre la commande dans un emplacement plus standard, tel que /usr/local/bin - Panther
@enzotib - merci, j'ai ajouté cela à ma réponse. - Panther
Au point 2, vous ne définissez pas un alias mais une variable. - pabouk


Les alias sont déconseillés au profit des fonctions shell. Du bash page de manuel:

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

Pour créer une fonction et l'exporter dans des sous-couches, mettez 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.


49
2018-01-26 18:28



Cela fonctionne presque ... Le seul problème est que je dois pouvoir passer différents drapeaux à l’exécutable "mpiexec" ... Par exemple, je dois pouvoir exécuter quelque chose comme "petsc -n 40 myexecutable" avec le alias "petsc" - Paul
@ Paul: j'ai ajouté "$@" juste pour gérer les arguments. - enzotib


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

  • (si vous ne vous embêtez pas à utiliser mpiexec au lieu de petsc) Ajouter $HOME/petsc-3.2-p6/petsc-arch/bin à ton PATH variable. 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éer le répertoire ~/bin et

    • faire un script wrapper nommé petsc contenant:

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

      ln -s ~/petsc-3.2-p6/petsc-arch/bin/mpiexec ~/bin/petsc
      

11
2018-01-26 18:52





En 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

Sinon, définissez comme variable puis utilisez la substitution de commande ou eval.

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

alias foo="echo test"

le définir comme:

foo="echo test"

au lieu. Ensuite, exécutez-le soit par:

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

ou:

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

6
2018-06-01 22:31



Bien que les alias soient déconseillés au profit des fonctions shell, cette réponse est la seule qui devrait être acceptée. Même l'ancienne Debian 8 a la version 4 de bash, donc la ${BASH_ALIASES[alias]} est une option intéressante Sinon, je devais modifier beaucoup de lignes de mes .bash_aliases pour appliquer d'autres choses. Je vous remercie. - erm3nda


Vous pouvez forcer bash à exécuter votre script en tant que shell interactif avec l'indicateur -i. Cela dira à votre fichier .bashrc pour 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

3
2018-01-10 08:03



.bashrc est également lu lors de l'exécution d'une commande SSH non interactive (c'est pourquoi il vérifie l'interactivité en haut) - muru
J'ai édité ma réponse. Merci @muru - Amado Martinez


  1. Dans .bash_aliases:

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

Ou mettre la fonction dans .bashrc si vous appelez souvent. Être dit que dans .bashrc seuls les paramètres de configuration de bash est stocké.

  1. Dans le terminal: source .bash_aliases
  2. petsc arg(s)

Avantage: vous n'avez pas besoin export -f petscdans .bash_aliases. Les alias sont obsolètes mais je suppose en utilisant .bash_aliases n'est pas.


3
2018-03-28 09:07



J'aime cette solution, je vais essayer plus tard - Greenonline


  1. Utilisez vos alias dans votre script shell.
  2. Source 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

2
2017-07-25 00:00



@DavidFoerster Cette méthode fonctionne bien. Sourcing d'un script avec le . ou source buiiltin provoque la actuel shell pour exécuter toutes les commandes qu'il contient. Si une extension d’alias se produirait dans le shell dans lequel . ou source est exécuté, il se produit. Cependant, il est important de comprendre que cette méthode n'est parfois utile que parce que souvent, il est nécessaire ou veut exécuter un script dans son propre shell, avec son propre environnement. Les scripts shell écrits avec l'intention d'être exécutés de la manière habituelle ne devraient généralement pas être utilisés à la place - ils ne fonctionnent souvent pas correctement. - Eliah Kagan
@EliahKagan: Merci. Maintenant, je comprends ce que la réponse est censée signifier. Je vais ajouter une explication. - David Foerster


(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 pas simplement placer 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?


1
2018-01-26 19:22



La raison pour laquelle je ne peux pas le mettre dans mon $ PATH est que j'ai un autre fichier "mpiexec" dans un autre répertoire qui est déjà dans mon $ PATH. Si j'ajoute le chemin à ce nouveau 'mpiexec', il essaiera probablement de les exécuter tous les deux, n'est-ce pas? - Paul
Ne peut pas comprendre pourquoi pas simplement utiliser "$@". - enzotib
Paul, ça va essayer d'exécuter celui qui est le premier dans le PATH, pas les deux. - unhammer
enzotib, ah j'ai mal compris comment mpiexec a été appelé, je pensais qu'il avait besoin de tous les arguments. Va éditer ma réponse :) - unhammer


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 les scripts shell au lieu d'alternatives, est la suivante:

#!/bin/bash

shopt -s expand_aliases

alias foo=bar

foo whatever

Pour ce qui est de Pourquoi Je voudrais faire ceci: en raison de circonstances inhabituelles, je dois piéger un fichier Dockerfile en lui faisant croire qu’il s’agit d’un script shell.


1
2017-07-18 00:50