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?


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?


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.


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.


3

Colocar um &no final parece fazer o truque:

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

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


@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'

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.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.