Je souhaite créer un alias, qui exécute le programme x, sans changer le répertoire actuel dans lequel je me trouve. Ce que j'ai maintenant, c'est:
alias x = "cd /home/path_to_x && ./x"
Cela fonctionne, mais change mon répertoire. Ce que je souhaite faire est quelque chose comme:
alias x="./home/path_to_x/x
Mais alors je ne reçois aucun fichier ou répertoire. Quelqu'un connaît une solution de contournement pour cela?
DON'T CD, lancez-le simplement en utilisant son chemin absolu
Cette version:
cd /home/path_to_x && ./x
change le répertoire en un chemin absolu (vous voyez comment /home/...
commence au répertoire racine) puis exécute le fichier exécutable au relatif chemin ./x
(c'est-à-dire, relatif dans le nouveau répertoire de travail).
Cette version:
./home/path_to_x/x
tente d'exécuter l'exécutable à l'emplacement relatif ./home/path_to_x/x
, qui signifie relatif à quel que soit votre répertoire de travail actuel . Cela explique pourquoi vous obtenez l'erreur - ce chemin relatif n'existe pas vraiment.
La commande que vous voulez serait:
/home/path_to_x/x
en utilisant à nouveau le chemin absolu (à partir du répertoire racine /
).
Oh, et vous pouvez aussi simplement ajouter /home/path_to_x
à votre PATH
au lieu de créer un alias. Voir: Comment exécuter des scripts sans taper le chemin complet?
Si vous ne voulez pas que cd
reste après la substitution d'alias, utilisez un sous-shell avec (
et )
:
alias my_x="(cd /home/path_to_x && ./x)&"
vous pouvez vérifier avec
alias test_y="(cd /tmp && sleep 10 ) & "
Notez que la solution
alias my_y="/home/path_to_x/x"
n'est pas exactement équivalent. En fait, s'il est appelé via my_x
, le programme x
est exécuté avec un répertoire en cours /home/path_to_x/
, tandis que s'il est appelé par my_y
, x
est exécuté avec un répertoire en cours qui correspond à celui où la commande my_y
a été émise. Cela peut être important ou non selon ce que x
fait.
À propos de solution OP , cela fonctionne dans bash
:
romano@RRyS:~$ pwd
/home/romano
romano@RRyS:~$ alias x="cd /bin && ./echo A >/dev/null &"
romano@RRyS:~$ x
[1] 16611
romano@RRyS:~$ pwd
/home/romano
mais pas dans zsh
:
[romano:~] % pwd
/home/romano
[romano:~] % alias x="cd /bin && ./echo A >/dev/null &"
[romano:~] % x
[1] 16744
[1] + 16744 done ./echo A > /dev/null
1& [romano:/bin] % pwd
/bin
[romano:/bin] %
Il semble que bash et zsh exécutent les listes de différentes manières ... il est donc préférable d'ajouter la parenthèse explicite ... merci @EliahKagan de me l'avoir signalée.
Si le fichier que vous voulez exécuter est déjà exécutable, pourquoi ne l'ajoutez-vous pas à votre variable PATH?
Si votre fichier exécutable est /home/user/aplication/appX
, entrez simplement
PATH=$PATH:/home/user/application
à votre ~/.bashrc
ou ~/.profile
Après avoir redémarré votre console, vous pouvez l’exécuter simplement avec appX
Je pense que c'est la solution la plus propre.
Mettre un &
à la fin semble faire l'affaire:
alias x = "cd /home/path_to_x && ./x &"
Sauvegardez votre pwd actuel et, après avoir exécuté votre commande, annulez votre dernier pwd.
alias x='dwp=$(pwd) && cd /home/path_to_x && ./x && cd $dwp'