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?
command-line
alias
Le pêcheur
la source
la source
alias x='/home/path_to_x/x'
. Ne pas utiliser.
avant/home
..
(point) fait référence au répertoire courant.x
vraiment ê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?Réponses:
NE PAS CD, exécutez-le simplement en utilisant son chemin absolu
Cette version:
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:
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:
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
à votrePATH
au lieu de créer l'alias. Voir: Comment exécuter des scripts sans taper le chemin complet?la source
pwd
/home/path_to_x/x
n'est pas fonctionnellement équivalent à(cd /home/path_to_x && ./x)
; si cela fonctionne ou non dépend de l'application.Si vous ne voulez pas que le
cd
reste après la substitution d'alias, utilisez un sous-shell avec(
y)
:vous pouvez le vérifier avec
Notez que la solution
n'est pas exactement équivalent. En fait, s'il est appelé via
my_x
, lex
programme est exécuté avec un répertoire courant/home/path_to_x/
, tandis que s'il est appelé parmy_y
, ilx
est exécuté avec un répertoire courant qui est celui où la commande amy_y
été émise. Cela peut être important ou non selon ce que vousx
faites.Concernant la solution OP , elle fonctionne en
bash
:mais pas dans
zsh
: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é.
la source
&
une priorité supérieure à celle qui&&
semble être uniquezsh
. J'ai essayésleep 5 && echo done &
danszsh
,bash
,ksh
,mksh
,dash
, et même un obus non Bourne style (tcsh
).zsh
Évalué uniquementsleep 5
au premier plan; tous les autres sont revenus immédiatement (puis imprimésdone
cinq secondes plus tard, bien sûr). D'un autre côté, même si cela est entièrement une particularité dezsh
, 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).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/appX
juste entrezà 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.
la source
Mettre un
&
à la fin semble faire l'affaire:la source
x
vous êtes/home/path_to_x
. À&
la fin, envoyez simplement le processus en arrière-plan.cd
s 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.)zsh
et effectivement elle fonctionne dansbash
et non danszsh
... doit être une certaine différence dans la façon dont les alias sont développés.pushd
inzsh
(je l'aisetopt autopushd pushdsilent pushdtohome
, et il se souvient de mon cwd.)Obtenez une sauvegarde de votre pwd actuel et après avoir exécuté votre commande, annulez votre dernier pwd.
la source
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).pushd
etpopd
faites ce que fait votre réponse.alias x='pushd /home/path_to_x && ./x && popd'