这个问题分为两部分。很抱歉。第一个问题:如果我使用 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
?
答案1
当前目录是进程的一个属性。不同的进程可以有不同的当前目录,并且一个进程不能修改另一个进程的当前目录。
当您打开命令窗口(有时被错误地称为 DOS 窗口)时,它会启动cmd.exe
。它cmd.exe
可以执行您在键盘上键入的命令,以及来自.bat
或.cmd
文件的命令。它不了解.sh
文件。
shell 脚本.sh
通过启动一个 shell(不同的进程)来执行,文件中的命令.sh
会改变 shell 进程的当前目录。它不会改变命令解释器的目录cmd.exe
。
批处理文件由命令解释器执行cmd.exe
,因此会更改命令解释器的当前目录。批处理文件执行完成后,此更改仍然有效。
答案2
当您启动命令提示符窗口时,您将创建一个会话。如果您从该提示符运行批处理文件,它将在该会话内启动,从而改变该会话。鉴于 shell 脚本需要不同的解释器来理解该脚本内部发生的事情,从技术上讲,启动该脚本时会创建一个新会话,因此,chdir 不会从会话中执行到上一个命令提示符窗口,而直接从该命令提示符窗口运行 .bat 文件时则会执行。
您要做的是首先启动一个新的 cmd 进程并在其中执行批处理脚本。这样,脚本对当前目录所做的任何更改都不会传输回之前的会话,因为它们是不同的会话。
您可以通过运行以下命令来执行此操作:
cmd /c "runscript.bat"
/c 将打开一个新的命令窗口,执行命令,然后终止该窗口。如果使用 /k,它将执行相同的操作,只是窗口会保留,这基本上意味着重新使用当前窗口。 /c 是终止而 /k 是继续,而不是 /c = 继续而 /k = 终止,这确实很奇怪,但这只是 Microsoft 逻辑。