当前的 POSIX 规范没有为 dot.
内置指定任何选项。
如果我做类似的事情:
$ echo 'echo .' > /tmp/-foo
$ PATH=/tmp "$shell" -c '. -foo'
那么不同 shell 的结果是不同的:
dash
,ash
,ksh88
, Bourne shell、schily sh、schily osh、heirloom sh 效果很好。bash
,yash
,ksh93
,pdksh
,mksh
,posh
不。更改命令以. -- -foo
在这些 shell 中运行。
而且,使用--
是一种不合规的方式,因为POSIX 规范说内置的不符合实用程序语法指南会忽略--
。
zsh
是唯一适用于这两种情况的 shell。
那么如何才能. filename
在类似 Bourne 或 POSIX 的 shell 中可靠地工作呢?
答案1
为了避免与 shell 相关的影响,请将完整路径传递给.
.. /absolute/path/to/script
并. relative/path/to/script
在所有 shell 中工作。
无论如何,路径查找对于源脚本来说很少有用。如果您确实需要 PATH 查找,那么您可以手动进行查找,以防文件名以-
.或者您可以要求文件名不以 , 开头-
,以保持简单。
答案2
我认为这部分是一个理论问题。
实际上,我可以通过避免-
作为所包含脚本的第一个字符或通过提供脚本路径(相对或绝对并不重要)来使其可靠地工作。
再次从实际的角度来看,我更喜欢为已知的 shell 编写代码,但如果不可能的话,我可能会得到一个case
包含在函数内的丑陋的语句。除非泛化*csh
也必须扩展到 shell,在这种情况下我可能会逃跑。