Executar um comando específico em um determinado diretório sem cd'ing para ele?

38

Existe uma maneira de executar um comando em um diretório diferente sem ter que cd ? Eu sei que eu poderia simplesmente cd in e cd out, mas estou interessado apenas nas possibilidades de renunciar a etapas extras:)

    
por Naftuli Kay 26.05.2011 / 03:09

6 respostas

49

Eu não sei se isso conta, mas você pode fazer um subshell:

$ (cd /var/log && cp -- *.log ~/Desktop)

O diretório só é alterado para essa sub-rede, então você evita o trabalho de precisar cd - depois.

    
por 26.05.2011 / 04:44
13

Alguns programas têm opções com as quais você pode avisá-los para chdir (2) (por exemplo, o -C / --directory do GNU tar

Entretanto, fora desses programas, algo deverá ser chdir . Você poderia escrever e usar algum tipo de programa “binário” compilado em vez de fazer o shell fazê-lo, mas provavelmente não renderia muito benefício.

Em um comentário em outra resposta, você deu um exemplo:

execindirectory -d /var/log "cp *.log ~/Desktop"

Como o padrão *.log é expandido pelo próprio shell (não cp ), algo precisará ser chdir para o diretório antes que um shell avalie seu comando.

Se você é apenas interessante em evitar ter que “cd back”, então você pode usar um subshell para isolar o efeito do cd da sua instância de shell de trabalho.

(cd /path/to/dir && some command)

Você pode compactar isso em uma função de shell. (Eu eliminei a opção -d do seu uso de exemplo, pois há pouco sentido nesse comando se o diretório for realmente opcional.)

runindir() { (cd "$1" && shift && eval "$@"); }

runindir /var/log 'cp *.log ~/Desktop'  # your example
runindir /var/log cp \*.log \~/Desktop  # eval takes multiple args

runindir /var/log cp \*.log ~/Desktop   # it is okay to expand tilde first
    
por 26.05.2011 / 04:41
9

Não minar o valor das respostas dadas por outras pessoas, mas acredito que o que você quer é:

(cd /path/to && ./executable [ARGS])

Observe os parentes para invocar cd em um sub-shell.

    
por 26.05.2011 / 11:25
4

Aqui está algo que deve deixar você cd de volta onde você estava (usando o Bash), já que não esquecer de fazer isso parece ser o propósito da pergunta:

# Save where you are and cd to other dir
pushd /path/to/dir/that/needs/to/be/current/dir

run-your-command

# Get back where you were at the beginning.
popd

(EDIT: versão ligeiramente mais curta, graças a @ Random832)

    
por 26.05.2011 / 13:53
2

Infelizmente, seu exemplo:

execindirectory -d /var/log "cp *.log ~/Desktop"

não precisa mudar para o diretório, porque

cp /var/log/*.log ~/Desktop

faria o mesmo. Você não pode se aproximar de seu problema real? Porque podemos conhecer uma solução melhor para isso também.

Uma maneira complicada de resolver seu problema, que está longe da elegância da solução Michaels, é o uso de find, que possui um switch '-execdir' para ser executado no diretório, onde um arquivo é encontrado. Mal adotado para o seu exemplo:

find /var/log -maxdepth 1 -type f -name "*.log" -execdir echo cp {} ~/Desktop ";"

Talvez seja útil para o seu problema real. -okdir em vez de -execdir pedirá para confirmar todas as invocações.

-okdir e -execdir podem precisar do gnu-find para ser instalado, o qual é tipicamente usado no Linux.

    
por 26.05.2011 / 06:23
1

Que tal ./your/path/command.sh ?

    
por 26.05.2011 / 03:16