Execute o comando com o caminho relativo (superior). Usando outro diretório de trabalho

2

Eu preciso executar um aplicativo (msp430-gcc) usando um caminho relativo de um makefile. O problema é que o aplicativo está em uma ramificação de pasta diferente, por isso preciso fazer algo assim:

../../../../tools/msp430/bin/msp430-gcc

Aqui, o problema é que o sistema não consegue encontrar o aplicativo. No entanto, se eu fizer:

cd ../../../../tools/msp430/bin
./msp430-gcc

então funciona.

Você sabe como posso executar o aplicativo a partir do meu local inicial sem usar "cd"?

Agradecemos antecipadamente pelo seu tempo.

    
por dberenguer 22.09.2014 / 19:42

1 resposta

5

As palavras-chave aqui são: comando de execução com diretório de trabalho diferente . Você pode pesquisar no Google para encontrar mais informações.

Você pode chamá-lo usando parênteses - ()

$ (cd ../../../../tools/msp430/bin &&./msp430-gcc)

Os parênteses criarão um novo subshell para executar comandos dentro dele. Este novo subshell irá mudar o diretório e executar o programa neste diretório.

Citação de man bash

(list)    list  is  executed  in  a  subshell  environment (see COMMAND
          EXECUTION ENVIRONMENT below).  Variable assignments and builtin 
          commands that affect the shell's environment do not remain in 
          effect after the command completes.  The return status is the
          exit status of list.

em que list é apenas uma sequência normal de comandos.

Variables in a subshell are not visible outside the block of code in the subshell.
They are not accessible to the parent process, to the shell that launched the
subshell. These are, in effect, local variables. 
Directory changes made in a subshell do not carry over to the parent shell.

Em conclusão: o subshell verá todas as variáveis de parent shell , mas as usará como local . Alterações feitas por subshell para variáveis não afetam parent shell

Outro método usando sh :

$ sh -c 'cd ../../../../tools/msp430/bin; ./msp430-gcc'

Nesse caso, sh -c não gerará subshell , mas criará um novo shell. É por isso que não é possível ver parent shell variables . Então lembre-se: se você definir alguma variável antes de executar sh -c new shell não a verá.

Mas também há um pouco de confusão entre usar aspas simples '' e aspas duplas "" em sh -c . Veja esta pergunta para entender a diferença, mostrarei apenas pouco exemplo:

$ TEST=test1
$ sh -c 'echo $TEST'

$ sh -c 'TEST=test2;echo $TEST'
test2

depois de executar o primeiro comando, nada foi impresso. É porque o novo shell não tem TEST variable e '' não expande $TEST .

$ sh -c "echo $TEST"
test1
$ sh -c "TEST=test2;echo $TEST"
test1

aqui o primeiro comando $TEST foi expandido devido ao uso de "" , e mesmo se definirmos a variável TEST no novo shell $TEST já expandido e imprimimos test1

Fontes

  1. Sobre sh -c "command" . Resposta muito completa.
  2. Sobre parênteses
  3. Similar pergunta
  4. Do guia bash sobre parênteses
  5. Diferença entre '' e ""
por c0rp 22.09.2014 / 19:58