Usando um shell Linux , como inicio um programa com um diretório de trabalho diferente do diretório de trabalho atual?
Por exemplo, eu tenho um arquivo binário helloworld
que cria o arquivo hello-world.txt
no diretório atual .
Este arquivo está dentro do diretório /a
.
Atualmente, estou no diretório /b
. Quero iniciar meu programa em execução ../a/helloworld
e obter o hello-world.txt
lugar em um terceiro diretório /c
.
linux
shell
environment
Anton Daneyko
fonte
fonte
su
redefine o diretório de trabalho para o diretório inicial do usuário especificado antes de executar qualquer-c
comando. Isso foi muito útil para mim.Respostas:
Chame o programa assim:
Os parênteses fazem com que um sub-shell seja gerado. Esse sub-shell altera seu diretório de trabalho para
/c
e executa ahelloworld
partir de/a
. Após a saída do programa, o sub-shell é finalizado, retornando ao prompt do shell pai, no diretório em que você iniciou.Tratamento de erros: Para evitar a execução do programa sem ter alterado o diretório, por exemplo, ao escrever incorretamente
/c
, torne a execuçãohelloworld
condicional:Reduzindo o uso de memória: Para evitar que o subshell desperdice memória enquanto o hello world é executado, chame
helloworld
via exec:[Obrigado a Josh e Juliano por dar dicas sobre como melhorar esta resposta!]
fonte
Semelhante à resposta de David Schmitt , mais a sugestão de Josh, mas não deixa um processo de shell em execução:
Dessa forma, é mais parecido com o modo como você geralmente executa comandos no shell. Para ver a diferença prática, você deve executar a
ps ef
partir de outro shell com cada solução.fonte
Uma opção que não requer um subshell e é incorporada ao bash
Demo:
fonte
pushd SOME_PATH && run_stuff && popd
- se run_stuff falhar, o popd não será executado.set -e
o arquivo e, em seguida, falhariapopd
.pushd "${SOME_PATH}" && run_stuff; popd
é melhor que a resposta atual, uma vez que a semântica pushd / popd foi projetada especificamente para essa situação de entrar em algum diretório e depois voltar ao original.fonte
Eu sempre acho que as ferramentas UNIX devem ser escritas como filtros, ler a entrada do stdin e gravar a saída no stdout. Se possível, você pode alterar o binário do helloworld para gravar o conteúdo do arquivo de texto em stdout, em vez de um arquivo específico. Dessa forma, você pode usar o shell para gravar seu arquivo em qualquer lugar.
$ cd ~ / b
$ ~ / a / helloworld> ~ / c / helloworld.txt
fonte
Basta alterar o último "&&" para ";" e ele retornará o CD, não importa se o comando falhar ou for bem-sucedido:
fonte
Uma maneira de fazer isso é criar um script de shell wrapper.
O script do shell alteraria o diretório atual para / c, depois executaria / a / helloworld. Depois que o script do shell sai, o diretório atual é revertido para / b.
Aqui está um exemplo de script do shell bash:
fonte
por que não simplificar
cd SOME_PATH && run_some_command && cd -
o último comando 'cd' o levará de volta ao último diretório pwd. Isso deve funcionar em todos os sistemas * nix.
fonte
run_some_command
falhar,cd -
não será executado.Se você sempre deseja que ele vá para / C, use um caminho absoluto ao escrever o arquivo.
fonte
Se você deseja executar isso dentro do seu programa, eu faria algo como:
fonte
do diretório atual forneça o caminho completo para o diretório de scripts para executar o comando
fonte