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

9

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 est:

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

Cela fonctionne, mais change mon répertoire. Ce que je souhaite faire, c'est quelque chose comme:

alias x="./home/path_to_x/x

Mais je ne reçois aucun fichier ou répertoire de ce type. Quelqu'un connaît une solution à cela?

Le pêcheur
la source
9
définir un alias comme alias x='/home/path_to_x/x'. Ne pas utiliser .avant /home. .(point) fait référence au répertoire courant.
souravc
2
Doit-il xvraiment être exécuté tout en étant /home/path_to_x? Ou vous n'êtes pas sûr de savoir comment exécuter un programme résidant dans un répertoire spécifique?
Adaephon
Une autre question similaire askubuntu.com/questions/427818/…
c0rp

Réponses:

13

NE PAS CD, exécutez-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 l'exécutable au chemin relatif./x (c'est-à-dire par rapport au nouveau répertoire de travail).

Cette version:

./home/path_to_x/x

essaie d'exécuter l'exécutable sur le chemin relatif./home/path_to_x/x , ce qui signifie par rapport à ce que votre répertoire de travail actuel est maintenant . Cela explique pourquoi vous obtenez l'erreur - ce chemin relatif n'existe vraiment pas.

La commande que vous souhaitez serait:

/home/path_to_x/x

en utilisant à nouveau le chemin absolu (en commençant par le répertoire racine /).

Oh, et vous pouvez également simplement ajouter /home/path_to_xà votre PATHau lieu de créer l'alias. Voir: Comment exécuter des scripts sans taper le chemin complet?

Inutile
la source
Ceci est la bonne réponse à la question posée.
pause jusqu'à nouvel ordre.
1
Cela ne serait incorrect que si le programme devait être exécuté dans un répertoire spécifique dont il provientpwd
Kaz Wolfe
@Whaaaaaat a raison. /home/path_to_x/xn'est pas fonctionnellement équivalent à (cd /home/path_to_x && ./x); si cela fonctionne ou non dépend de l'application.
Rmano
Bien que vous ayez raison en général, pour cette question spécifique, OP essayait visiblement de courir à partir du chemin absolu (juste avec une erreur à un caractère). Cependant, je suis sûr qu'ils peuvent clarifier si le répertoire de travail est important dans ce cas.
inutile
8

Si vous ne voulez pas que le cdreste après la substitution d'alias, utilisez un sous-shell avec (y ):

alias my_x="(cd /home/path_to_x && ./x)&" 

vous pouvez le 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 xprogramme est exécuté avec un répertoire courant /home/path_to_x/, tandis que s'il est appelé par my_y, il xest exécuté avec un répertoire courant qui est celui où la commande a my_yété émise. Cela peut être important ou non selon ce que vous xfaites.

Concernant la solution OP , elle fonctionne en 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 pointé.

Rmano
la source
1
Donner à la fin &une priorité supérieure à celle qui &&semble être unique zsh. J'ai essayé sleep 5 && echo done &dans zsh, bash, ksh, mksh, dash, et même un obus non Bourne style ( tcsh). zshÉvalué uniquement sleep 5au premier plan; tous les autres sont revenus immédiatement (puis imprimés donecinq secondes plus tard, bien sûr). D'un autre côté, même si cela est entièrement une particularité de zsh, je pense que l'ajout explicite ( )(ou { ;}) est raisonnable, car il transmet l'intention à d'autres humains (ou à soi-même, lors de la lecture du script ou de l'histoire plus tard).
Eliah Kagan du
4

Si le fichier que vous souhaitez 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/appXjuste entrez

PATH=$PATH:/home/user/application

à votre ~/.bashrcou~/.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.

0xAffe
la source
3

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

alias x = "cd /home/path_to_x && ./x &"
Le pêcheur
la source
2
Êtes-vous sûr? Après l'exécution, xvous êtes /home/path_to_x. À &la fin, envoyez simplement le processus en arrière-plan.
Rmano
2
@Rmano Cela fonctionne réellement. cds en arrière-plan n'affectent pas l'appelant (ce qui est logique - ce serait vraiment bizarre s'ils le faisaient). En effet, l' exécution asynchrone utilise un sous-shell . Bien que ce serait mieux s'il expliquait pourquoi cela fonctionne et ce qui &fonctionne - et comment le fonctionnement en arrière-plan est parfois indésirable - c'est (déjà) une bonne réponse. ( Faire explicitement un sous-shell avec la ( )syntaxe, comme vous le suggérez , est probablement une meilleure solution la plupart du temps.)
Eliah Kagan
@EliahKagan vous avez raison. J'ai vérifié la solution avec zshet effectivement elle fonctionne dans bashet non dans zsh... doit être une certaine différence dans la façon dont les alias sont développés.
Rmano
Poser
Rmano
@Rmano avez-vous activé les paramètres liés à pushdin zsh(je l'ai setopt autopushd pushdsilent pushdtohome, et il se souvient de mon cwd.)
muru
0

Obtenez une sauvegarde de 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'
αғsнιη
la source
Vous avez mal compris l'effet de l'alias de ce Rmano. La ligne de commande n'est pas bloquée. C'est juste que la sortie de l'alias ( test) a poussé le curseur sur la ligne suivante. Vous pouvez toujours faire ce que vous voulez (y compris en appuyant sur Entrée pour ouvrir une nouvelle invite).
muru
oui, oui. @mure: |
αғsнιη
Notez que puisque vous utilisez des guillemets doubles, la variable inclura le répertoire courant au moment où l'alias est défini . Utilisez des guillemets simples pour différer l'évaluation jusqu'à ce que l'alias soit développé. Cependant, pushdet popdfaites ce que fait votre réponse. alias x='pushd /home/path_to_x && ./x && popd'
pause jusqu'à nouvel ordre.