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?
command-line
alias
O pescador
fonte
fonte
alias x='/home/path_to_x/x'
. Não use.
antes/home
..
(ponto) refere-se ao diretório atual.x
realmente 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?Respostas:
NÃO CD, basta executá-lo usando seu caminho absoluto
Esta versão:
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:
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:
usando o caminho absoluto (iniciando no diretório raiz
/
) novamente.Ah, e você também pode adicionar
/home/path_to_x
ao seu emPATH
vez de criar o alias. Consulte: Como executar scripts sem digitar o caminho completo?fonte
pwd
/home/path_to_x/x
não é funcionalmente equivalente a(cd /home/path_to_x && ./x)
; se funciona ou não, depende da aplicação.Se você não deseja que o
cd
stick permaneça após a substituição do alias, use um subshell com(
y)
:você pode conferir com
Observe que a solução
não é exatamente equivalente. Na verdade, se chamado via
my_x
, ox
programa é executado com um diretório atual/home/path_to_x/
, enquanto que, se chamado pormy_y
,x
é executado com um diretório atual que é aquela em que o comandomy_y
foi emitido. Isso pode ser importante ou não, dependendo do quex
está sendo feito.Sobre a solução OP , ela trabalha em
bash
:mas não em
zsh
: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.
fonte
&
precedência mais alta do que&&
parece ser exclusivozsh
. Eu tenteisleep 5 && echo done &
emzsh
,bash
,ksh
,mksh
,dash
, e até mesmo um shell-Bourne-style não (tcsh
). Apenaszsh
avaliadosleep 5
em primeiro plano; todos os outros retornaram imediatamente (depois também impressosdone
cinco segundos depois, é claro). Por outro lado, mesmo que isso seja inteiramente uma peculiaridadezsh
, 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).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/appX
apenas digitepara o seu
~/.bashrc
ou~/.profile
Após reiniciar o console, você pode executá-lo simplesmente com
appX
Eu acho que essa é a solução mais limpa.
fonte
Colocar um
&
no final parece fazer o truque:fonte
x
você está em/home/path_to_x
. No&
final, basta enviar o processo em segundo plano.cd
s 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.)zsh
e efetivamente ela funciona dentrobash
e não dentrozsh
... deve haver alguma diferença na forma como os aliases são expandidos.pushd
azsh
(eu tenhosetopt autopushd pushdsilent pushdtohome
, e ele se lembra de meu cwd.)Faça backup do seu pwd atual e, depois de executar seu comando, desfaça seu último pwd.
fonte
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).pushd
epopd
faça o que sua resposta faz.alias x='pushd /home/path_to_x && ./x && popd'