Executa o programa de qualquer lugar sem alterar o diretório

8

Eu desejo criar um alias, que execute o programa x, sem alterar o diretório atual em que estou. O que tenho agora é:

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

Isso funciona, mas muda meu diretório. O que eu quero fazer é algo como:

alias x="./home/path_to_x/x

Mas não consigo esse arquivo ou diretório. Alguém sabe uma solução para isso?

    
por TheFisherman 15.10.2014 / 10:00

5 respostas

13

NÃO FAÇA CD, apenas execute-o usando seu caminho absoluto

Esta versão:

cd /home/path_to_x && ./x

muda o diretório para um caminho absoluto (você vê como /home/... começa no diretório raiz) e então executa o executável no caminho relativo ./x (ou seja, relativo ao novo trabalho diretório).

Esta versão:

./home/path_to_x/x

tenta executar o executável no caminho relativo ./home/path_to_x/x , o que significa em relação a qualquer que seja seu diretório de trabalho atual agora . Isso explica por que você recebe o erro - esse caminho relativo realmente não existe.

O comando que você quer seria:

/home/path_to_x/x

usando o caminho absoluto (iniciando no diretório raiz / ) novamente.

Ah, e você também pode adicionar /home/path_to_x ao seu PATH em vez de criar o alias.

    
por Useless 15.10.2014 / 18:56
7

Se você não quiser que o cd permaneça após a substituição do alias, use um subshell com ( y ) :

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

você pode verificá-lo com

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

Observe que a solução

alias my_y="/home/path_to_x/x" 

não é exatamente equivalente. De fato, se chamado via my_x , o programa x é executado com um diretório atual /home/path_to_x/ , enquanto se chamado por my_y , x é executado com um diretório atual que é aquele em que o comando my_y foi emitido. Isso pode ser importante ou não, dependendo do que o x está fazendo.

Sobre a solução OP , ela funciona em 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

mas não em 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] % 

Parece que o bash e o zsh executam listas de maneiras diferentes ... então é melhor adicionar o parêntese explícito ... obrigado @EliahKagan por apontar para mim.

    
por Rmano 15.10.2014 / 10:38
3

Colocar um & no final parece ser o truque:

alias x = "cd /home/path_to_x && ./x &"
    
por TheFisherman 15.10.2014 / 10:05
3

Se o arquivo que você deseja executar já estiver sendo executado, por que você não o adiciona à variável PATH?

Se o seu arquivo executável for /home/user/aplication/appX , basta digitar

PATH=$PATH:/home/user/application

para o seu ~/.bashrc ou ~/.profile

Depois de reiniciar seu console, você pode executá-lo simplesmente com appX

Acho que esta é a solução mais limpa.

    
por 0xAffe 15.10.2014 / 19:11
0

Obtenha o backup do seu pwd atual e, depois de executar o comando, desfaça seu último pwd.

alias x='dwp=$(pwd) && cd /home/path_to_x && ./x && cd $dwp'
    
por αғsнιη 15.10.2014 / 17:57