调用dash传入目录作为首个参数为何正常退出?与bash/zsh有何差异?
为什么dash传入目录作为首个参数会正常退出?
先看实际执行的差异:
- 执行以下命令,dash会以退出码0正常结束:
% mkdir -p tmp_dir % dash tmp_dir - 但换成bash或zsh则会失败报错:
% bash tmp_dir tmp_dir: tmp_dir: is a directory
原因在于不同shell对脚本参数的处理逻辑不同:
- dash的处理逻辑:它不会预先检查传入的路径是否为普通文件,只会尝试打开路径并读取内容执行。目录在UNIX中属于可打开的文件类型,
open()系统调用能成功打开目录,但读取目录内容时会直接返回EOF(空数据流)。dash读取到空内容后,等同于没有需要执行的命令,因此正常退出,退出码为0。 - bash/zsh的处理逻辑:这两个shell在执行脚本前会额外做检查,验证传入的路径是否为普通文件。一旦发现是目录,就直接抛出错误并以非零退出码终止,不会继续尝试读取内容。
另外,POSIX标准并没有强制要求shell必须检查脚本路径是否为普通文件,dash的行为符合标准规范,而bash/zsh的严格检查是它们各自的实现选择。
内容的提问来源于stack exchange,提问作者pavelgein
相关产品推荐
相关产品推荐

