我的回答StackOverflow 获得了至少两票赞成,它是在我以前工作场所使用的工作站外壳上运行的。在该工作站上,可能是某些旧版本的 SunOS 或 Red Hat Commercial Linux 或 Red Hat Enterprise Linux,[[ -fwd
path
]]
测试是否存在path
作为常规文件和可写目录。sh
、bash
、csh
、tcsh
和zsh
是该工作站上唯一可能安装的 shell,我很可能在 中运行它bash
。
我问这个问题是因为我现在无法在其他类 Unix 操作系统上重现这个问题。它总是给我一个语法错误,所以我开始怀疑我是否成功运行过它。
我的问题是:此代码在哪些系统上有效,如果有效,这是错误还是功能?
答案1
不,那不行。在任何版本的 bash 中都没有。
此测试适用于任何 bash 版本(事实上,在任何 shell 中):
$ [ -fwd ] && echo "It worked" || echo "not"
It worked
但它测试的不是文件标志,而是测试字符串-fwd
长度是否为0。由于它有一些特征,所以测试是正确的。
使用[[
更改允许的标志:
$ [[ -fwd ]] && echo "It worked" || echo "not"
b204sh : /home/user/so: line 3: unexpected argument to conditional unary operator
在 bash 到 bash 3.2 中都会出现上述错误。
3.2以后的bash版本没有错误,但结果是真实的:
$ [[ -fwd ]] && echo "It worked" || echo "not"
It worked
这是不可能的:目录项不能同时是文件 ( -f
) 和目录 ( -d
)。
这证实了测试实际上是在测试字符串的想法:
$ [[ \-fwd ]] && echo "It worked" || echo "not"
It worked
使用文件进行测试
$ touch wds
$ [[ -fwd wds ]] && echo "It worked" || echo "not"
bash: conditional binary operator expected
bash: syntax error near `wds'
在 3.2 之后的 bash 版本上给出失败消息。
对于其他版本,它给出了真实的答案(这对于文件测试来说是不可能的,目录条目不能同时是文件和目录)。
比较这两个测试,似乎只使用了第一个字母:
$ b204sh -c '[[ -fd wds ]] && echo "It worked" || echo "not"'
It worked
$ b204sh -c '[[ -df wds ]] && echo "It worked" || echo "not"'
not
可能在 bash 4 上修正了一个错误
也失败于:
西施 [[: No match.
tcsh [[: Command not found.
桀骜 unknown condition: -fd
# 版本5.4.2
克什 syntax error at line 3:
wds' 意外` # 版本 AJM 93u+ 2012-08-01