符号链接的奇妙用法

符号链接的奇妙用法

RayAlto OP

之前关机、重启一直是用 systemctl 的子命令,比如:

1
2
systemctl poweroff # 关机
systemctl reboot # 重启

但最近注意到 /usr/bin/poweroff/usr/bin/reboot 都是 /usr/bin/systemctl 的符号链接:

1
2
3
rayalto@RayAltoNAS ~$ ls -hl /usr/bin/{poweroff,reboot}
lrwxrwxrwx 1 root root 9 Jul 6 03:25 /usr/bin/poweroff -> systemctl
lrwxrwxrwx 1 root root 9 Jul 6 03:25 /usr/bin/reboot -> systemctl

一开始给我看愣住了,我寻思都是 systemctl 的符号链接,那 systemctl 是怎么知道我想要干什么的呢?如果我执行 poweroff start sshd.service 等同于 systemctl start sshd.service 吗?

想了想突然想到 argv[0] 应该是关键所在,写一个简单的程序:

1
2
3
4
5
6
7
8
// test.cpp

#include <iostream>

int main(int argc, const char* argv[]) {
std::cout << argv[0] << '\n';
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
rayalto@RayAltoXL ~/test$ ./test
./test
rayalto@RayAltoXL ~/test$ ln -s ./test foo
rayalto@RayAltoXL ~/test$ ln -s ./test bar
rayalto@RayAltoXL ~/test$ ./foo
./foo
rayalto@RayAltoXL ~/test$ ./bar
./bar
rayalto@RayAltoXL ~/test$ ls -hl
total 16K
lrwxrwxrwx 1 rayalto rayalto 6 Jul 11 19:15 bar -> ./test
lrwxrwxrwx 1 rayalto rayalto 6 Jul 11 19:15 foo -> ./test
-rwxr-xr-x 1 rayalto rayalto 16K Jul 11 19:08 test

索然无味,整个烂活:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <filesystem>
#include <iostream>
#include <string>
#include <string_view>

std::string response(const std::string_view& input) {
std::string base_name = std::filesystem::path{input}.filename().string();
if (base_name == "原神") {
return "启动!";
}
if (base_name == "114") {
return "514";
}
if (base_name == "cargo") {
return "run!";
}
return "一德阁拉米";
}

int main(int argc, const char* argv[]) {
std::cout << response(argv[0]) << '\n';
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
rayalto@RayAltoXL ~/test$ g++ test.cpp -o test
rayalto@RayAltoXL ~/test$ ln -s ./test 原神
rayalto@RayAltoXL ~/test$ ln -s ./test 114
rayalto@RayAltoXL ~/test$ ln -s ./test cargo
rayalto@RayAltoXL ~/test$ ls -hl
total 40K
lrwxrwxrwx 1 rayalto rayalto 6 Jul 11 19:58 114 -> ./test
lrwxrwxrwx 1 rayalto rayalto 6 Jul 11 19:58 cargo -> ./test
-rwxr-xr-x 1 rayalto rayalto 34K Jul 11 19:58 test
-rw-r--r-- 1 rayalto rayalto 504 Jul 11 19:57 test.cpp
lrwxrwxrwx 1 rayalto rayalto 6 Jul 11 19:58 原神 -> ./test
rayalto@RayAltoXL ~/test$ ./114
514
rayalto@RayAltoXL ~/test$ ./cargo
run!
rayalto@RayAltoXL ~/test$ ./原神
启动!
rayalto@RayAltoXL ~/test$ ./test
一德阁拉米

Linux 的符号链接不如 M$ 的「快捷方式」那样强劲(其实 M$ 的快捷方式 *.lnk 是一个二进制格式文件, M$ 有专门的文档 , M$ 又在链接里放 UUID 了,果然品味不一般),我实在是没想到还能这样被用出花来。

又水了一篇 Blog 开心滴捏,最近终于把一件大事办好了,虽然很明显是我太过废物才有这样的结果,但我还是很开心的,放低姿态,心态放平,安安心心做个废物也挺开心的。

小绿可爱滴捏 PID: 109071592

小绿找我有事,我先走了 ᕕ(◠ڼ◠)ᕗ 。

目录
符号链接的奇妙用法