Esegui il programma da qualsiasi luogo senza cambiare directory


9

Vorrei creare un alias, che esegue il programma x, senza cambiare la directory corrente in cui mi trovo. Quello che ho ora è:

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

Funziona, ma cambia la mia directory. Quello che vorrei fare è qualcosa di simile:

alias x="./home/path_to_x/x

Ma poi non ottengo tale file o directory. Qualcuno sa una soluzione alternativa per questo?


9
impostare un alias come alias x='/home/path_to_x/x'. Non usare .prima /home. .(punto) si riferisce alla directory corrente.
souravc,

2
Ha xdavvero bisogno di essere eseguito mentre ci si trova /home/path_to_x? Oppure non sei sicuro di come eseguire un programma che risiede in una directory specifica?
Adaephon,


Un'altra domanda simile askubuntu.com/questions/427818/…
c0rp

Risposte:


13

NON CD, basta eseguirlo usando il suo percorso assoluto

Questa versione:

cd /home/path_to_x && ./x

cambia la directory in un percorso assoluto (vedi come /home/...inizia nella directory principale) e quindi esegue l'eseguibile nel percorso relativo./x (ovvero, relativamente alla nuova directory di lavoro).

Questa versione:

./home/path_to_x/x

tenta di eseguire l'eseguibile nel percorso relativo./home/path_to_x/x , il che significa relativo a qualunque sia la directory di lavoro corrente ora . Questo spiega perché si ottiene l'errore: questo percorso relativo in realtà non esiste.

Il comando desiderato sarebbe:

/home/path_to_x/x

utilizzando /nuovamente il percorso assoluto (a partire dalla directory principale ).

Oh, e puoi anche solo aggiungere /home/path_to_xal tuo PATHinvece di creare l'alias. Vedi: Come eseguire gli script senza digitare il percorso completo?


Questa è la risposta corretta alla domanda come posta.
In pausa fino a ulteriore avviso.

1
Ciò sarebbe errato solo se il programma dovesse essere eseguito in una directory specifica da cui provienepwd
Kaz Wolfe,

@Whaaaaaat ha ragione. /home/path_to_x/xnon è funzionalmente equivalente a (cd /home/path_to_x && ./x); se funziona o meno dipende dall'applicazione.
Rmano,

Sebbene tu abbia ragione in generale, per questa domanda specifica OP stava visibilmente cercando di correre dal percorso assoluto (solo con un errore di un carattere). Tuttavia, sono sicuro che possono chiarire se la directory di lavoro è importante in questo caso.
Inutile

8

Se non si desidera cdche si attacchi dopo la sostituzione dell'alias, utilizzare una subshell con (y ):

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

puoi controllarlo con

alias test_y="(cd /tmp && sleep 10 ) & "

Si noti che la soluzione

alias my_y="/home/path_to_x/x" 

non è esattamente equivalente. In effetti, se chiamato via my_x, il xprogramma viene eseguito con una directory corrente /home/path_to_x/, mentre se chiamato da my_y, xviene eseguito con una directory corrente che è quella in cui è my_ystato emesso il comando . Questo può essere importante o meno a seconda di cosa xsta facendo.

A proposito della soluzione OP , funziona in 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

ma non in 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] % 

Sembra che bash e zsh eseguano gli elenchi in diversi modi ... quindi è meglio aggiungere la parentesi esplicita ... grazie @EliahKagan per avermelo indicato.


1
Dare al trailing &una precedenza più alta di &&quanto possa sembrare unico zsh. Ho provato sleep 5 && echo done &a zsh, bash, ksh, mksh, dash, e anche uno shell non-Bourne-style ( tcsh). zshValutato solo sleep 5in primo piano; tutti gli altri tornarono immediatamente (poi stampati anche donecinque secondi dopo, ovviamente). D'altra parte, anche se questa è una peculiarità zsh, penso che l'aggiunta esplicita ( )(o { ;}) sia ragionevole, in quanto trasmette l'intento ad altri umani (o a se stessi, quando leggono la sceneggiatura o la storia in seguito).
Eliah Kagan,

4

Se il file che si desidera eseguire è già eseguibile, perché non lo si aggiunge alla variabile PATH?

Se il tuo file eseguibile è /home/user/aplication/appXsemplicemente inserire

PATH=$PATH:/home/user/application

al tuo ~/.bashrco~/.profile

Dopo aver riavviato la tua console, puoi eseguirla semplicemente con appX

Penso che questa sia la soluzione più pulita.


3

Mettere un &alla fine sembra fare il trucco:

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

2
Sei sicuro? Dopo l'esecuzione xsei dentro /home/path_to_x. Alla &fine è sufficiente inviare il processo in background.
Rmano,

2
@Rmano Funziona davvero. cds nei lavori in background non influiscono sul chiamante (il che ha senso - sarebbe davvero strano se lo facessero). Questo perché l'esecuzione asincrona utilizza una subshell . Anche se questo sarebbe meglio se spiegasse perché funziona e cosa &funziona - e in che modo l'esecuzione in background è talvolta indesiderabile - questa è (già) una risposta corretta. ( Fare esplicitamente una subshell con ( )sintassi, come suggerisci , è probabilmente una soluzione migliore per la maggior parte del tempo.)
Eliah Kagan,

@EliahKagan hai ragione. Ho verificato la soluzione con zshed efficacemente funziona bashe non in zsh... deve essere una differenza nel modo in cui gli alias vengono espansi.
Rmano,


@Rmano hai abilitato le impostazioni relative a pushdin zsh(ho setopt autopushd pushdsilent pushdtohome, e ricorda il mio CWD.)
Muru

0

Ottieni il backup del tuo pwd corrente e, dopo aver eseguito il comando, annulla l'ultimo pwd.

alias x='dwp=$(pwd) && cd /home/path_to_x && ./x && cd $dwp'

Hai frainteso l'effetto dell'alias di quel Rmano. La riga di comando non è bloccata. È solo che l'output dell'alias ( test) ha spostato il cursore sulla riga successiva. Puoi ancora fare quello che vuoi lì (incluso premendo Invio per aprire un nuovo nuovo prompt).
muru,

sì, sì, corretto. @mure: |
αғsнιη,

Si noti che poiché si utilizzano virgolette doppie, la variabile includerà la directory corrente al momento della definizione dell'alias . Utilizzare le virgolette singole per rinviare la valutazione fino a quando l'alias non viene espanso. Tuttavia, pushde popdfai quello che fa la tua risposta. alias x='pushd /home/path_to_x && ./x && popd'
In pausa fino a ulteriore avviso.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.