为什么下面的测试说文件不存在?

为什么下面的测试说文件不存在?

鉴于

$ PSEXE="$(whereis ps)" 
$ echo $PSEXE
ps: /nix/store/06sa9q0xmd3rhqbd0pb5kpdhz68vq2pk-system-path/bin/ps
$ file  /nix/store/06sa9q0xmd3rhqbd0pb5kpdhz68vq2pk-system-path/bin/ps
/nix/store/06sa9q0xmd3rhqbd0pb5kpdhz68vq2pk-system-path/bin/ps: symbolic link to /nix/store/1mhhpcb9dxyila8jqa3x1cqj9nd3l4sg-procps-3.3.16/bin/ps

为什么下面的测试说文件不存在?

$ if [ ! -x "$PSEXE" ]
> then
> echo yes
> fi
yes

谢谢。

答案1

让我们解构您的脚本:

PSEXE="$(whereis ps)" 
echo "$PSEXE"

在我的系统上,这会返回与您的系统形状非常相似的内容,我们可以继续:

ps: /bin/ps

特别注意该变量$PSEXE包含字符串ps: /bin/ps

然后您就可以得到带有条件表达式的脚本:

if [ ! -x "$PSEXE" ]

shell 有效地将其评估为

if [ ! -x 'ps: /bin/ps' ]

没有文件ps: /bin/ps,因此可执行测试失败,应用否定,并且结果表达式的计算结果为true.


如果您只是想查明 中是否存在可执行文件$PATH,您可以使用type

PSEXE='ps'
if type "$PSEXE" >/dev/null 2>&1
then
    echo "Executable exists"
fi

bash可以轻松提取目标可执行文件:

PSEXE=`type -p ps 2>/dev/null`

但对于 POSIX 来说,sh情况有点复杂:

PSEXE=`type ps 2>/dev/null | sed -n 's/^[^ ]* is //p'`

相关内容