鉴于
$ 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'`