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), j'ai créé un alias dans mon .bashrc
fichier personnel:
alias petsc="~/petsc-3.2-p6/petsc-arch/bin/mpiexec"
ce qui me permet d’exécuter mpiexec
facilement ce fichier à 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
comme commande. Après avoir donné à mon script shell les autorisations appropriées (utilisation chmod
), j'ai essayé de l'exécuter. 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 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? Existe-t-il un moyen de modifier mon .bashrc
ou .bash_profile
pour que cela se produise?
.bash_aliases
? Aussi que diriez-vous d'aliasing le chemin absolu au lieu du chemin relatif commealias petsc='/home/user/petsc-3.2-p6/petsc-arch/bin/mpiexec'
Réponses:
Dans votre script, utilisez le chemin complet plutôt qu'un alias.
Dans votre script shell, définissez une variable, une syntaxe différente
Utilisez une fonction dans votre script. Probablement mieux si
petsc
est complexeSource vos alias
Vous ne voulez probablement pas
.bashrc
trouver votre source , alors, IMO, un des 3 premiers serait préférable.la source
shopt -s expand_aliases
le même script.|
. Ici, useshopt -s expand_aliases
& local alias, par exemplealias myalias='echo abc|rev'
- nécessite une rupture de ligne avant utilisation (voir ALIASES dansman bash
). Point 4: Le fichier généré peut empêcher une exécution non interactive, c'est-à-dire dans un script. Recherchez tôtexit
oureturn
, par exemple[ -z "$PS1" ] && return
(vérifie si l'invite principale n'est pas définie indiquant un shell non interactif) ou s'il peut y avoir une vérificationi
dans$-
($-
contient des options de shell,i
signifie interactif). Voirman bash
pour ces variables.Les alias sont déconseillés au profit des fonctions du shell. De la
bash
page de manuel:Pour créer une fonction et l'exporter en sous-shell, insérez ce qui suit dans votre
~/.bashrc
:Ensuite, vous pouvez librement appeler votre commande à partir de vos scripts.
la source
"$@"
juste pour gérer les arguments.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 prenez pas la peine d'utiliser
mpiexec
au lieu depetsc
) Ajoutez$HOME/petsc-3.2-p6/petsc-arch/bin
à votrePATH
variable. Cela peut être fait en éditant~/.profile
et en ajoutant:Se reconnecter pour appliquer ces changements
Créer le répertoire
~/bin
etfaire un script wrapper nommé
petsc
contenant:si le programme le permet, vous pouvez ignorer le shellscript et créer un lien symbolique à l'aide de la commande suivante:
la source
En bash 4 , vous pouvez utiliser la variable spéciale:
$BASH_ALIASES
.Par exemple:
Sinon, définissez comme variable, puis utilisez la substitution de commande ou
eval
.Ainsi, par exemple, au lieu de définir un alias tel que:
le définir comme:
au lieu. Puis exécutez-le soit:
ou:
la source
${BASH_ALIASES[alias]}
une bonne option. Sinon, je devais éditer beaucoup de lignes de mes .bash_aliases pour appliquer d'autres choses. Je vous remercie.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:
Plus d'informations:
la source
.bashrc
est également lu lors de l'exécution d'une commande SSH non interactive (c'est pourquoi il dispose d'un contrôle d'interactivité en haut)Donc, la vraie réponse à cette question, pour ceux qui cherchent à utiliser des alias réels dans des scripts de shell au lieu de leurs alternatives, est la suivante:
Quant à la raison pour laquelle je veux faire ceci: En raison de circonstances inhabituelles, je dois duper une Dockerfile en pensant qu'il est un script shell.
la source
Dans
.bash_aliases
:Ou mettez la fonction dans
.bashrc
. Habituellement,.bashrc
seuls les paramètres de configuration debash
sont enregistrés.Dans le terminal:
source .bash_aliases
petsc arg(s)
Avantage: vous n'avez pas besoin
export -f petsc
dans.bash_aliases
. Les alias sont déconseillés, mais l'utilisation.bash_aliases
de fonctions est correcte.la source
Donc, si vous avez un fichier appelé
script.sh
avec vos commandes incluant l’utilisation d’alias, tapez simplement:la source
.
ousource
buiiltin force le shell actuel à exécuter toutes les commandes qu'il contient . Si le développement d'alias se produit dans le shell dans lequel.
ousource
est exécuté, il se produit. Cependant, il est important de réaliser que cette méthode n’est parfois utile, car on a souvent besoin ou on veut exécuter un script dans son propre shell, avec son propre environnement. Les scripts shell écrits dans l'intention d'être exécutés de la manière habituelle ne doivent généralement pas être recherchés, ils ne fonctionneront souvent pas correctement.(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?
la source
"$@"
.