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
相关产品推荐
相关产品推荐

