Chr*_*urm 7 executable symlink filenames
一直困扰我一段时间的一件事是:
% which halt
/sbin/halt
% file /sbin/halt
/sbin/halt: symbolic link to `reboot'
Run Code Online (Sandbox Code Playgroud)
但是,执行sudo halt当然不会重新启动系统。这是为什么?
例如,还有其他几个程序以这种方式工作pdflatex。
Mik*_*kel 13
每个程序都可以看到用于运行它的完整命令行(除了通配符和变量,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
Run Code Online (Sandbox Code Playgroud)
man ln如果您不熟悉硬链接,请参阅有关硬链接的更多详细信息。