Этот вопрос двухсторонний. Извини за это. Первый вопрос: если я использую сценарий bash (.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?

2 ответа2

0

Текущий каталог является свойством процесса. Разные процессы могут иметь разные текущие каталоги, и процесс не может изменить текущий каталог другого процесса.

Когда вы открываете командное окно (иногда ошибочно называемое окном DOS), запускается cmd.exe . Этот cmd.exe может выполнять команды, которые вы вводите на клавиатуре, а также команды из файла .bat или .cmd . Он не знает о файлах .sh .

Сценарий оболочки .sh выполняется путем запуска оболочки, другого процесса, а команды в файле .sh изменяют текущий каталог процесса оболочки. Он не меняет каталог интерпретатора команд cmd.exe .

Пакетный файл выполняется интерпретатором команд cmd.exe и поэтому изменяет текущий каталог интерпретатора команд. Это изменение остается в силе после завершения выполнения командного файла.

0

Когда вы запускаете окно командной строки, вы создаете сеанс. Если вы запустите командный файл из этого приглашения, он будет запущен внутри этого сеанса, изменяя этот сеанс. Учитывая, что сценарию оболочки требуется другой интерпретатор, чтобы понять, что происходит внутри этого сценария, технически говоря, при запуске этого сценария создается новый сеанс, и поэтому chdir не выполняется из сеанса к предыдущему окну командной строки. тогда как файл .bat запускается непосредственно из этого окна командной строки, это так.

Что вы хотите сделать - это сначала запустить новый процесс cmd и выполнить там пакетный скрипт. При этом любые изменения, вносимые скриптом в текущий каталог, не переносятся обратно в более ранний сеанс, так как это разные сеансы.

Вы делаете это с помощью следующей команды:

cmd /c "runscript.bat"

/ C откроет новое командное окно, выполнит команду и закроет это окно. Если вы используете / k, он будет делать то же самое, за исключением того, что окно остается, что в основном означает повторное использование текущего окна. Действительно странно, что / c завершается, а / k продолжается, а не / c = continue и / k = kill, но это всего лишь Microsoft Logic.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .