J'ai un fichier exécutable mpiexec
name__, 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é script
name__, en utilisant mon nouvel alias petsc
en tant que commande. Après avoir donné les autorisations appropriées à mon script Shell (à l'aide de chmod
name__), 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 mpiexec
name__, 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 petsc
dans le fichier de script? Est-il possible de modifier mon .bashrc
ou .bash_profile
pour que cela se produise?
Dans votre script Shell, utilisez le chemin complet plutôt qu'un alias.
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
Utilisez une fonction dans votre script. Probablement mieux si petsc
est complexe
function petsc () {
command 1
command 2
}
petsc myexecutable
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.
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.
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 mpiexec
au lieu de petsc
name__) Ajoutez $HOME/petsc-3.2-p6/petsc-Arch/bin
à votre variable PATH
name__. 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é petsc
contenant:
#!/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
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`" \;
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.
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.
Dans le terminal: source .bash_aliases
petsc arg(s)
Avantage: vous n'avez pas besoin de export -f petsc
in .bash_aliases
. Les alias sont obsolètes, mais utiliser .bash_aliases
pour les fonctions est correct.
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
Donc, si vous avez un fichier appelé script.sh
avec vos commandes incluant l’utilisation d’alias, tapez simplement:
source script.sh
(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?