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

9

Desejo criar um alias, que executa 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 altera meu diretório. O que eu desejo fazer é algo como:

alias x="./home/path_to_x/x

Mas então não recebo esse arquivo ou diretório. Alguém conhece uma solução alternativa para isso?

O pescador
fonte
9
definir um apelido como alias x='/home/path_to_x/x'. Não use .antes /home. .(ponto) refere-se ao diretório atual.
souravc 15/10
2
Será que xrealmente precisa ser executado ao estar em /home/path_to_x? Ou você não tem certeza sobre como executar um programa que reside em um diretório específico?
Adaephon
Uma pergunta mais semelhantes askubuntu.com/questions/427818/...
c0rp

Respostas:

13

NÃO CD, basta executá-lo usando seu caminho absoluto

Esta versão:

cd /home/path_to_x && ./x

altera o diretório para um caminho absoluto (você vê como é /home/...iniciado no diretório raiz) e depois executa o executável no caminho relativo./x (ou seja, relativo ao novo diretório de trabalho).

Esta versão:

./home/path_to_x/x

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

O comando que você deseja 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_xao seu em PATHvez de criar o alias. Consulte: Como executar scripts sem digitar o caminho completo?

Sem utilidade
fonte
Esta é a resposta correta para a pergunta como colocada.
Pausado até novo aviso.
11
Isso só estaria incorreto se o programa precisasse ser executado em um diretório específico de onde ele é obtido #pwd
Kaz Wolfe
@Whaaaaaat está certo. /home/path_to_x/xnão é funcionalmente equivalente a (cd /home/path_to_x && ./x); se funciona ou não, depende da aplicação.
Rmano 16/10
Embora você esteja certo em geral, para esta pergunta específica, o OP estava tentando fugir do caminho absoluto (apenas com um erro de um caractere). No entanto, tenho certeza de que eles podem esclarecer se o diretório ativo é importante nesse caso.
Inútil
8

Se você não deseja que o cdstick 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 conferir 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. Na verdade, se chamado via my_x, o xprograma é executado com um diretório atual /home/path_to_x/, enquanto que, se chamado por my_y, xé executado com um diretório atual que é aquela em que o comando my_yfoi emitido. Isso pode ser importante ou não, dependendo do que xestá sendo feito.

Sobre a solução OP , ela trabalha 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 ... por isso é melhor adicionar parênteses explícitos ... obrigado @EliahKagan por apontar para mim.

Rmano
fonte
11
Dar à &precedência mais alta do que &&parece ser exclusivo zsh. Eu tentei sleep 5 && echo done &em zsh, bash, ksh, mksh, dash, e até mesmo um shell-Bourne-style não ( tcsh). Apenas zshavaliado sleep 5em primeiro plano; todos os outros retornaram imediatamente (depois também impressos donecinco segundos depois, é claro). Por outro lado, mesmo que isso seja inteiramente uma peculiaridade zsh, acho que acrescentar explícito ( )(ou { ;}) é razoável, pois transmite a intenção a outros humanos (ou a si mesmo, ao ler o roteiro ou a história posteriormente).
Eliah Kagan 15/10
4

Se o arquivo que você deseja executar já é executável, por que você não o adiciona à sua variável PATH?

Se o seu arquivo executável é /home/user/aplication/appXapenas digite

PATH=$PATH:/home/user/application

para o seu ~/.bashrcou~/.profile

Após reiniciar o console, você pode executá-lo simplesmente com appX

Eu acho que essa é a solução mais limpa.

0xAffe
fonte
3

Colocar um &no final parece fazer o truque:

alias x = "cd /home/path_to_x && ./x &"
O pescador
fonte
2
Você tem certeza? Depois de executar xvocê está em /home/path_to_x. No &final, basta enviar o processo em segundo plano.
Rmano 15/10
2
@Rmano Isso realmente funciona. cds em trabalhos em segundo plano não afetam o chamador (o que faz sentido - seria muito estranho se o fizessem). Isso ocorre porque a execução assíncrona usa um subshell . Embora isso seria melhor se explicasse por que funciona e o que &funciona - e como a execução em segundo plano às vezes é indesejável - essa é (já) uma resposta correta. ( Explicitamente fazer um subnível com ( )a sintaxe, como você sugere , é provavelmente a melhor solução na maioria das vezes embora.)
Elias Kagan
@EliahKagan, você está certo. Eu verifiquei a solução com zshe efetivamente ela funciona dentro bashe não dentro zsh... deve haver alguma diferença na forma como os aliases são expandidos.
Rmano 15/10
Uma pergunta feita: unix.stackexchange.com/questions/162286/…
Rmano 15/14
@Rmano fez você ativar as configurações relacionadas com pushda zsh(eu tenho setopt autopushd pushdsilent pushdtohome, e ele se lembra de meu cwd.)
Muru
0

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

alias x='dwp=$(pwd) && cd /home/path_to_x && ./x && cd $dwp'
αғsнιη
fonte
Você não entendeu o efeito do pseudônimo de Rmano. A linha de comando não está bloqueada. É que a saída do alias ( test) empurrou o cursor para a próxima linha. Você ainda pode fazer o que quiser lá (incluindo pressionar Enter para abrir um novo prompt).
Muru
sim, sim correto. @mure: |
αғsнιη
Observe que, como você usa aspas duplas, a variável incluirá o diretório atual no momento em que o alias estiver definido . Use aspas simples para adiar a avaliação até que o alias seja expandido. No entanto, pushde popdfaça o que sua resposta faz. alias x='pushd /home/path_to_x && ./x && popd'
Pausado até novo aviso.