You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux shell命令test -ef为何未按手册描述处理软链接?

test -ef比较软链接与原文件返回yes的原因解析

给student.sh创建硬链接hard和软链接soft后,发现硬链接与原文件inode相同,软链接inode不同,但使用test -ef比较原文件与软链接时,结果返回yes,与预期不符。

具体操作与测试

1. 创建链接命令

$ ln /home/pi/Desktop/links/student.sh hard
$ ln -s /home/pi/Desktop/links/student.sh soft

2. 查看文件inode信息

$ ls -ial
278224 drwxr-xr-x  2 pi pi 4096  6月  5 23:31 .
262125 drwxr-xr-x 12 pi pi 4096  6月  5 23:17 ..
278227 -rwxr-xr-x  2 pi pi   43  6月  5 23:20 hard
278225 lrwxrwxrwx  1 pi pi   33  6月  5 23:31 soft -> /home/pi/Desktop/links/student.sh
278227 -rwxr-xr-x  2 pi pi   43  6月  5 23:20 student.sh

3. test -ef测试结果

# 预期输出no,但实际输出yes
$ [ ./student.sh -ef ./soft ] && echo yes || echo no
yes

$ [ ./student.sh -ef ./hard ] && echo yes || echo no
yes

4. 测试脚本执行结果

测试脚本test.sh:

#!/usr/bin/env bash

if [[ ./student.sh -ef ./soft ]]; then
  echo "yes"
else
  echo "no"
fi

if [[ ./student.sh -ef ./hard ]]; then
  echo "yes"
else
  echo "no"
fi

执行结果:

$ ./test.sh 
yes
yes

期望结果

$ [ ./student.sh -ef ./soft ] && echo yes || echo no
no

$ [ ./student.sh -ef ./hard ] && echo yes || echo no
yes

原因说明

test -ef(包括[[ ... -ef ... ]])的作用是比较两个路径最终解析到的实体文件的inode编号和设备编号是否一致。对于软链接,该命令会自动跟随链接,解析到它指向的目标文件(即student.sh),所以./soft最终指向的实体文件和./student.sh是同一个,inode相同,因此返回yes。

如果需要比较软链接本身的inode(而非它指向的文件),可以使用stat命令直接获取软链接的inode进行对比:

$ stat -c '%i' ./student.sh | grep -q "$(stat -c '%i' ./soft)" && echo yes || echo no
no

内容的提问来源于stack exchange,提问作者xgqfrms

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 15:12:47