web-dev-qa-db-fra.com

Exécuter le programme de n'importe où sans changer de répertoire

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?

9
TheFisherman

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?

13
Useless

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.

8
Rmano

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.

3
0xAffe

Mettre un & à la fin semble faire l'affaire:

alias x = "cd /home/path_to_x && ./x &"
3
TheFisherman

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'
0
αғsнιη