与 shell 脚本不同,批处理文件是不可执行的吗?

Posted

技术标签:

【中文标题】与 shell 脚本不同,批处理文件是不可执行的吗?【英文标题】:are batch files NOT executable unlike shell scripts? 【发布时间】:2013-01-05 12:21:09 【问题描述】:

我正在使用boost.process 来运行带有一些给定输入的外部进程。用户可以指定该外部进程。所以大多数时候用户指定一个shell脚本或批处理脚本。

我只是在做boost::process::launch(_script, arguments, context);,只要它们可以按预期执行(+x),它既适用于真正的可执行文件,也适用于 shell 脚本。但是当我在 Windows 中运行它时。如果我在_script 中传递一个批处理文件,它不起作用但是如果我指定一个真正的可执行文件,它就会起作用。

这让我觉得在 Windows 中批处理脚本根本不是可执行文件?它们只是通过 cmd.exe 解释的!这是真的吗?

我可以启动cmd.exe 并指定/c _script argv 作为命令行参数。但这不会是跨平台的。

我不想拨打system() 电话,因为我无法完全控制已创建的进程?

【问题讨论】:

Shell 脚本是否可执行? 至少我可以通过boost::process::launch启动它们 @MartinJames:有点。 #! 是一个 16 位的幻数,它告诉内核“当这个文件被执行时,运行下面的程序将这个文件的名称作为参数传递给它”。该程序当然恰好是脚本的解释器,在本例中是 shell。在 Windows 上,批处理文件不包含这种诡计。 【参考方案1】:

没错,批处理文件不能直接执行,需要命令处理器来运行。

也就是说,解决可移植性问题应该相当简单,并且可以在编译时(通过预处理器宏)或运行时(Windows 特定的环境变量?脚本文件扩展名?)完成。

我可能会选择前者,因为它更健壮。

【讨论】:

排除系统依赖关系的一个好方法是为不同的系统设置不同的头文件,由为编译器设置的包含路径选择。使用预处理器宏通常会造成混乱。也就是说,几乎在任何代码库中都可以看到混乱 它甚至不能保证 Windows 中的所有可执行文件都是批处理脚本。所以检查扩展名中的.bat 会更安全。 @NeelBasu:请记住,cmd /c 可以正确处理可执行文件和批处理文件。 但它不会创建一个cmd 窗口吗?实际上我需要连续运行 100 次可执行文件。所以它不应该弹出 100 个窗口 @NeelBasu:如果使用 Win32 API,您可以通过传递 CREATE_NO_WINDOW 标志来解决这个问题。 Boost 大概有一个等价物,或者是一种传递标志的方式。

以上是关于与 shell 脚本不同,批处理文件是不可执行的吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何将shell脚本变为可执行文件

第8章:Shell脚本归档与压缩

shell脚本规范与变量运用

Shell脚本学习指南 [ 第四章 ] 查找与替换文本处理工具

Shell脚本编写1

Shell脚本编程规范与变量