通过组合标志来测试多个文件条件 - 它有效吗?

通过组合标志来测试多个文件条件 - 它有效吗?

我的回答StackOverflow 获得了至少两票赞成,它是在我以前工作场所使用的工作站外壳上运行的。在该工作站上,可能是某些旧版本的 SunOS 或 Red Hat Commercial Linux 或 Red Hat Enterprise Linux,[[ -fwdpath]]测试是否存在path作为常规文件和可写目录。shbashcshtcshzsh是该工作站上唯一可能安装的 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.
[[: Command not found.
unknown condition: -fd# 版本5.4.2
syntax error at line 3:wds' 意外` # 版本 AJM 93u+ 2012-08-01

相关内容