一段时间以来一直困扰我的一件事是:
% which halt
/sbin/halt
% file /sbin/halt
/sbin/halt: symbolic link to `reboot'
然而,执行sudo halt
当然会不是重新启动系统。这是为什么?
例如,还有其他几个程序以这种方式工作pdflatex
。
答案1
每个程序都可以看到用于运行它的完整命令行(除了 shell 扩展的通配符和变量)。
在 C 程序中,命令行存储在 中argv
,它是参数向量。
程序的名称是 的第一个元素argv
,即argv[0]
。
halt
显然,在和的情况下reboot
,程序正在根据 改变其行为argv[0]
。
在 bash 中,您可以看到用于使用ps -p <pid> -o cmd
或运行程序的完整命令行cat /proc/<pid>/cmdline
。
请注意,还有另一种类型的链接称为硬链接,它具有相同的效果。例如,在我的系统上,sudo
和sudoedit
是同一个文件,但具有两个不同的名称和不同的行为。
ls -i
可以帮助您找到这些命令,例如:
$ ls -il | awk '$3 != 1 { print }'
total 156872
2491111 -rwsr-xr-x 2 root root 127560 2011-01-20 05:03 sudo
2491111 -rwsr-xr-x 2 root root 127560 2011-01-20 05:03 sudoedit
man ln
如果您不熟悉硬链接,请参阅参考资料 来了解有关硬链接的更多详细信息。