Процеси вбивства працюють по-різному для файлів .bat та .sh?


0

Це питання двопартійне. Вибач за те. Перше запитання: Якщо я використовую bash script ( .sh) і змінюю каталоги в межах цього сценарію, то пізніше, поки скрипт запущений, і я його вбиваю, я опиняюсь в тому каталозі, в якому я запустився. Однак, коли я намагаюся це зробити в .batсценарії, і я використовую chdirзамість цього cd, а потім вбиваю процес, я перебуваю в каталозі, в який я хотів chdirби. Приклад:

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

Потім у другому випадку:

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

Чому це відбувається? Чи можу я змусити .batсценарій повернутися назад після того, як процес буде вбито Ctrl + c?


Якщо ви перейменовуєте .bat файл у .cmd, чи він поводиться інакше? .bat - це давнє розширення з MS-DOS-днів, і тому така емуляція змушує поводитися по-різному, тоді як .cmd є сучасним.
LPChip

Крім того, ви позначите це вікном, але все ваше запитання кричить Linux. На якій ОС ви працюєте?
LPChip

@LPChip windows. навіщо використовувати сценарій bat у Linux?
awallace04

Шляхи для Windows використовують C:\folder1\folder2там, де ви використовуєте шлях у стилі Linux. Також сценарії sh також не є поширеними у Windows, хоча і неможливо. З цієї причини здавалося набагато більш імовірним, що ви, можливо, використовуєте linux у поєднанні з вином. Тож тому я запитав.
LPChip

Ах, я бачу, що ти маєш на увазі. Ні, я в Windows, але з причин мені потрібно мати .sh та .bat сценарій, які роблять те саме. Щоб відповісти на ваше перше запитання, зміна його на .cmd нічого не змінює.
awallace04

Відповіді:


0

Поточний каталог є властивістю процесу. У різних процесах можуть бути різні поточні каталоги, і процес не може змінювати поточний каталог іншого процесу.

Коли ви відкриєте вікно команд (іноді неправильно називається вікном DOS), воно запускається cmd.exe. Це cmd.exeможе виконувати команди, введені на клавіатурі, а також команди з .batабо .cmdфайлу. Про .shфайли він не знає .

Сценарій оболонки .shвиконується за допомогою запуску оболонки, іншого процесу, і команди у .shфайлі змінюють поточний каталог процесу оболонки. Він не змінює каталог інтерпретатора команд cmd.exe.

Пакетний файл виконується інтерпретатором команд cmd.exe, і для цього змінює поточний каталог інтерпретатора команд. Ця зміна діє досі після завершення виконання пакетного файлу.


Чи є спосіб, щоб я змусив пакетний сценарій працювати як сценарій оболонки? Я намагався робити це cdв новому процесі, але це не працює.
awallace04

Ні, ти не можеш. Це працює, але якраз у цьому новому процесі.
RalfFriedl

Чи не могли б ви пояснити "той самий процес" / "окремий процес" у самій відповіді? Як зараз ... "оболонка" та "інтерпретатор команд" - це лише два імені для однієї і тієї ж речі, тому головна відповідь просто не має сенсу.
grawity

Ця відповідь насправді не відповідає на питання, крім надання інформації про те, як все працює. Я для цього розмістив відповідь, яка насправді дає вирішення проблеми.
LPChip

0

Запускаючи вікно командного рядка, ви створюєте сеанс. Якщо ви запустите пакетний файл із цього підказки, він буде запущений всередині цього сеансу, змінивши цей сеанс. З огляду на те, що сценарій оболонки вимагає іншого інтерпретатора, щоб зрозуміти, що відбувається всередині цього сценарію, технічно кажучи, при запуску цього сценарію створюється новий сеанс, і chdir не проводиться з сеансу до попереднього вікна командного рядка. , тоді як з файлом .bat запускається безпосередньо з цього вікна командного рядка, це так.

Що ви хочете зробити, це спочатку запустити новий cmd процес і виконати пакетний скрипт там. Тим самим будь-які зміни, які скрипт вносить у поточний каталог, не переносяться назад на попередній сеанс, оскільки це різні сеанси.

Виконайте це, виконавши таку команду:

cmd /c "runscript.bat"

/ C відкриє нове вікно команди, виконає команду, а потім завершить це вікно. Якщо ви використовуєте / k, він зробить те саме, за винятком залишків вікна, що в основному означає повторне використання поточного вікна. Дійсно дивно, що / c припиняється і / k продовжується, а не / c = продовжується і / k = вбивається, але це лише Microsoft Logic.


Це не відповідає жодній частині запитання. Він взагалі не згадує сценарії оболонок і не відповідає, чому поточні каталоги працюють так, як вони роблять.
RalfFriedl

@RalfFriedl у вашій відповіді вже пояснюється, як вона працює, тому я лише додав цю частину відповіді, щоб не пояснити її ще раз. Але я відредагую свою відповідь за вас, так що це має трохи більше сенсу, чому це працює, навіть якщо це дійсно написано там.
LPChip
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.