Symlink
為什麼某些符號連結會影響程序行為?
讓我困惑一段時間的一件事是:
% which halt /sbin/halt % file /sbin/halt /sbin/halt: symbolic link to `reboot'
但是,執行
sudo halt
當然不會重新啟動系統。這是為什麼?還有其他幾個程序以這種方式工作,例如
pdflatex
.
每個程序都可以看到用於執行它的完整命令行(shell 擴展的萬用字元和變數除外)。
在 C 程序中,命令行儲存在 中
argv
,它是參數向量的縮寫。程序的名稱是 的第一個元素
argv
,即argv[0]
。顯然,在 and 的情況下
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
如果您不熟悉硬連結,請參閱有關硬連結的更多詳細資訊。