I processi di uccisione funzionano in modo diverso per un file .bat e .sh?


0

Questa domanda è in due parti. Mi dispiace per quello. Prima domanda: se utilizzo uno script bash ( .sh) e cambio directory all'interno di quello script, in seguito mentre lo script è in esecuzione e lo uccido, finisco di nuovo nella directory in cui ho iniziato. Tuttavia, quando provo a fare questo in uno .batscript, e io uso chdirinvece di cd, quindi uccido il processo, mi trovo nella directory che dovrei chdir. Un esempio:

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

Quindi nel secondo caso:

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

Perché succede? Posso .batriportare indietro lo script dopo che il processo è stato terminato Ctrl + c?


Se si rinomina il file .bat in .cmd, si comporta diversamente? .bat è una vecchia estensione dai tempi di MS-DOS, e come tale una certa emulazione lo fa comportare diversamente, mentre .cmd è moderno.
LPChip,

Inoltre, lo etichetta Windows, ma tutta la tua domanda urla Linux. Su quale sistema operativo sei?
LPChip,

@LPChip windows. perché usare uno script bat in linux?
awallace04,

I percorsi di Windows usano C:\folder1\folder2dove usi un percorso in stile linux. Anche gli script sh non sono comuni su Windows, anche se non impossibili. Per questo motivo sembrava molto più probabile che tu stia usando Linux in combinazione con wine forse. Ecco perché l'ho chiesto.
LPChip,

Ah, capisco cosa intendi. No, sono su Windows ma per motivi devo avere uno script .sh e .bat che fa la stessa cosa. Per rispondere alla tua prima domanda, cambiandola in un .cmd non cambia nulla.
awallace04,

Risposte:


0

La directory corrente è una proprietà di un processo. Processi diversi possono avere directory correnti diverse e un processo non può modificare la directory corrente di un altro processo.

Quando si apre la finestra di comando (a volte erroneamente chiamata finestra DOS), si avvia cmd.exe. Questo cmd.exepuò eseguire comandi digitati sulla tastiera, nonché comandi da un file .bato .cmd. Non conosce i .shfile.

Lo script della shell .shviene eseguito avviando una shell, un processo diverso, ei comandi nel .shfile cambiano la directory corrente del processo della shell. Non cambia la directory dell'interprete dei comandi cmd.exe.

Il file batch viene eseguito dall'interprete dei comandi cmd.exee quindi cambia la directory corrente dell'interprete dei comandi. Questa modifica è ancora in vigore al termine dell'esecuzione del file batch.


Esiste un modo per far funzionare lo script batch come lo script shell? Ho provato a farlo cdin un nuovo processo ma non funziona.
awallace04,

No, non puoi. Funziona, ma proprio in quel nuovo processo.
RalfFriedl,

Potresti inserire il chiarimento "stesso processo" / "processo separato" nella risposta stessa? Come è adesso ... "shell" e "interprete dei comandi" sono solo due nomi per la stessa cosa, quindi la risposta principale non ha proprio senso.
Grawity,

Questa risposta in realtà non risponde alla domanda, oltre a fornire informazioni su come funzionano le cose. Ho quindi pubblicato una risposta che fornisce effettivamente la soluzione al problema.
LPChip,

0

Quando si avvia una finestra del prompt dei comandi, si crea una sessione. Se si esegue un file batch da quel prompt, verrà lanciato all'interno di quella sessione, modificando quella sessione. Dato che uno script di shell richiede un interprete diverso per capire cosa succede all'interno di quello script, tecnicamente parlando, viene creata una nuova sessione all'avvio di quello script e, come tale, il chdir non viene eseguito dalla sessione alla finestra del prompt dei comandi precedente , mentre con il file .bat eseguito direttamente dalla finestra del prompt dei comandi, lo è.

Quello che vuoi fare è innanzitutto avviare un nuovo processo cmd ed eseguire lo script batch lì dentro. In questo modo, eventuali modifiche apportate dallo script alla directory corrente non vengono trasferite alla sessione precedente, poiché si tratta di sessioni diverse.

Puoi farlo eseguendo il comando seguente:

cmd /c "runscript.bat"

Il / c aprirà una nuova finestra di comando, eseguirà il comando, quindi terminerà quella finestra. Se usi / k, farà lo stesso, tranne che rimarrà la finestra, il che significa sostanzialmente, riutilizzare la finestra corrente. È davvero strano che / c sia terminato e / k sia continue, piuttosto che / c = continue e / k = kill, ma questa è solo Microsoft Logic.


Questo non risponde a nessuna parte della domanda. Non menziona affatto gli script di shell e non risponde al motivo per cui le directory attuali funzionano nel modo in cui funzionano.
RalfFriedl,

@RalfFriedl la tua risposta spiega già come funziona, quindi ho aggiunto solo questa parte della risposta per non spiegarla ancora. Ma modificherò la mia risposta per te, quindi ha un po 'più senso il motivo per cui funziona, anche se è davvero scritto lì.
LPChip,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.