为什么有些符号链接会影响程序行为?

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

请注意,还有另一种称为硬链接的链接将具有相同的效果。在我的示例系统,sudosudoedit与两个不同的名字,不同的行为相同的文件。

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如果您不熟悉硬链接,请参阅有关硬链接的更多详细信息。

  • @legate,符号链接没有,应用程序可以。使用其名称来定义其执行方式的程序的最佳示例是“busybox”。符号链接只是定义应用程序第 0 个参数的第一种方式。简单地重命名文件也足够了。 (6认同)