Existe uma maneira de executar um comando em um diretório diferente sem precisar fazê cd
-lo? Eu sei que eu poderia simplesmente entrar cd
e cd
sair, mas só estou interessado nas possibilidades de renunciar às etapas extras :)
linux
bash
cd-command
Naftuli Kay
fonte
fonte
echo "#!/bin/bash; cd $1; exec $2" > /usr/local/bin/execindirectory; chmod +x /usr/local/bin/execindirectory
. Pode ser necessário um pouco mais de esforço se você quiser realmente oferecer suporte a "tags" de opções, como-d
outras coisas.Respostas:
Não sei se isso conta, mas você pode fazer um subshell:
O diretório é alterado apenas para esse subshell, para evitar o trabalho de precisar
cd -
depois.fonte
$ (cd /var/log && cp *.log ~/Desktop)
. Dessa forma, se o diretório não existir, nenhum comando adicional será executado.Alguns programas têm opções com as quais você pode dizer a eles próprios para chdir (2) (por exemplo, GNU tar 's
-C
/--directory
).Fora de tais programas, porém, algo terá que chdir . Você pode escrever e usar algum tipo de programa "binário" compilado em vez de fazer com que o shell o faça, mas provavelmente não traria muitos benefícios.
Em um comentário em outra resposta, você deu um exemplo:
Como o
*.log
padrão é expandido pelo próprio shell (não pelo cp ), algo terá que chdir para o diretório antes de um shell avaliar seu comando.Se você é apenas interessante para evitar ter que “voltar ao cd”, pode usar um subshell para isolar o efeito do cd da sua instância do shell de trabalho.
Você pode empacotar isso em uma função shell. (Abandonei a
-d
opção do seu exemplo de uso, pois há pouco sentido nesse comando se o diretório for realmente opcional.)fonte
Não para minar o valor das respostas dadas por outras pessoas, mas acredito que o que você quer é o seguinte:
Observe as parênteses a serem invocadas
cd
em um subcasca.fonte
Aqui está uma coisa que deve deixar você
cd
voltar onde estava (usando o Bash), já que não esquecer disso parece ser o objetivo da pergunta:(EDIT: versão um pouco mais curta, graças a @ Random832)
fonte
pushd other-dir
, em vez depushd .; cd other-dir
Infelizmente, seu exemplo:
não precisa de uma alteração no diretório, porque
faria o mesmo. Você não pode se aproximar do seu problema real? Porque também podemos conhecer uma solução melhor para isso.
Uma maneira complicada de resolver seu problema, que está longe da elegância da solução Michaels, é o uso de find, que possui uma opção '-execdir' a ser executada no diretório em que um arquivo é encontrado. Mal adotado no seu exemplo:
Talvez seja útil para o seu problema real. -okdir em vez de -execdir solicitará que você confirme todas as chamadas.
-okdir e -execdir podem precisar do gnu-find para serem instalados, o que normalmente é usado no Linux.
fonte
Que tal
./your/path/command.sh
?fonte
execindirectory -d /var/log "cp *.log ~/Desktop"
.