gpt4 book ai didi

perl - 了解 Windows 批处理文件与 Perl 的 system() 函数的交互

转载 作者:行者123 更新时间:2023-12-04 23:47:23 25 4
gpt4 key购买 nike

批处理文件示例:

@echo off
echo starting
setlocal
cd c:\tmp
set A=B
perl -e "$ENV{X}='Y'; system('cmd')"
echo finished

我运行此脚本(在 Windows 7 上),工作目录设置在 c:\.该脚本按预期打开了一个新的命令 shell,其工作目录设置为 c:\tmp 并且环境设置如我的脚本中所定义。

作为下一步,我在这个 shell 中执行了 Control-C,我被要求 Terminate batch job (Y/N)?Y, 回答这个问题,我得到的错误消息是:

'Y' 不是内部或外部命令,也不是可运行的程序或批处理文件。

但是,我得到一个 shell 提示符,当前目录显示为 c:\tmp。假设我再次键入 Control-C。现在我看到了:

c:\tmp>^C
finished
c:\>

我的提示显示我的工作目录回到了 C:\但是,这个 shell 显示了一个有趣的行为 如果我在这个 shell 中反复点击 ENTER,我得到以下输出:

c:\>

c:\tmp>

c:\>

c:\tmp>

此外,我知道我有两个 shell 正在运行,交替获取我的输入: 一个工作目录设置为 C:\,另一个设置为 C:\tmp

知道这里发生了什么吗?有 Windows 7 的人可以用他/她的 Perl 版本试用我的示例批处理脚本吗?顺便说一句,我使用 Perl 5.8.8 运行它,因为这是该项目中使用的版本。

最佳答案

是的,我看到了相同的行为。 Ctrl+C 以某种方式通过前台 cmd.exe 并应用于父 perl 进程,该进程可能被杀死(取决于 Y/N 答案,perl 与批处理作业一起被杀死)。当cmd处于交互模式时,它通常会忽略Ctrl+C,所以它似乎是一个泄漏到父进程的错误。

旁注:结果是您剩下两个 cmd shell 试图 read() 单个终端输入。一旦一个人读到一行,他就处理它,另一个人跳进去并有机会 read() 下一行。等等。

解决方法是告诉 perl 忽略 SIGINT:

perl -e "$SIG{INT} = 'IGNORE'; ... "

您需要使用 exit 来完成前台 cmd 而不是 Ctrl+C。

关于perl - 了解 Windows 批处理文件与 Perl 的 system() 函数的交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8710716/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com