Processos de matança funcionam de maneira diferente para um arquivo .bat e um arquivo .sh?

0

Esta questão é um two-parter. Me desculpe por isso. Primeira pergunta: Se eu usar um script bash ( .sh ) e alterar diretórios dentro desse script, mais tarde, enquanto o script estiver rodando e eu o matar, acabo no diretório em que comecei. No entanto, quando tento para fazer isso em um script .bat , e eu uso chdir em vez de cd , depois mato o processo, estou no diretório para o qual eu chdir 'd. Um exemplo:

#runscript.sh
cd seconddir/thirddir/
# run some ongoing process here
----------------------------------
usr/firstdir> ./runscript.sh
[Ctrl + C]
usr/firstdir>

Então, no segundo caso:

#runscript.bat
chdir seconddir/thirddir/
# run some ongoing process here
----------------------------------
usr/firstdir> runscript.bat
[Ctrl + C]
usr/firstdir/thirddir>

Por que isso acontece? Posso fazer o script .bat voltar após o processo ser eliminado com Ctrl + c ?

    
por awallace04 27.09.2018 / 23:14

2 respostas

0

O diretório atual é uma propriedade de um processo. Diferentes processos podem ter diretórios atuais diferentes e um processo não pode modificar o diretório atual de outro processo.

Quando você abre a janela de comando (às vezes erroneamente chamada de janela do DOS), ela inicia cmd.exe . Esse cmd.exe pode executar comandos que você digita no teclado, bem como comandos de um arquivo .bat ou .cmd . Não sabe sobre .sh arquivos.

O script de shell .sh é executado iniciando um shell, um processo diferente e os comandos no arquivo .sh alteram o diretório atual do processo do shell. Não altera o diretório do interpretador de comandos cmd.exe .

O arquivo em lote é executado pelo interpretador de comandos cmd.exe e, portanto, altera o diretório atual do interpretador de comandos. Essa alteração ainda está em vigor após a conclusão do arquivo em lote.

    
por 27.09.2018 / 23:31
0

Quando você inicia uma janela de prompt de comando, cria uma sessão. Se você executar um arquivo em lote a partir desse prompt, ele será lançado dentro dessa sessão, alterando essa sessão. Dado que um script de shell requer um interpretador diferente para entender o que acontece dentro desse script, tecnicamente falando, uma nova sessão é criada quando esse script é iniciado e, como tal, o chdir não é executado da sessão para a janela do prompt de comandos anterior. , enquanto com o arquivo .bat executado diretamente a partir dessa janela de prompt de comando, é.

O que você quer fazer é primeiro iniciar um novo processo cmd e executar o script em lote lá. Ao fazer isso, qualquer alteração feita pelo script no diretório atual não será transferida de volta para a sessão anterior, pois são sessões diferentes.

Você faz isso executando o seguinte comando:

cmd /c "runscript.bat"

O / c abrirá uma nova janela de comando, executará o comando e encerrará essa janela. Se você usar / k, fará o mesmo, exceto que a janela permanece, o que basicamente significa reutilizar a janela atual. É realmente estranho que / c seja terminado e / k seja continuado, em vez de / c = continue e / k = kill, mas isso é apenas o Microsoft Logic.

    
por 28.09.2018 / 08:58