为什么重新引导,关机和关机符号链接到systemctl?


28

在Arch Linux中,如果这样做ls -l的话/sbin,我可以看到rebootshutdown并且poweroff它们都是的符号链接/usr/bin/systemctl。但发行rebootshutdownsystemctl命令显然并不都具有相同的行为。

ls -l不是向我展示有关符号链接的完整信息?例如,我怎么知道真正的符号链接reboot是什么?


1
有关更多信息,请参见unix.stackexchange.com/a/196014/5132
JdeBP '18年

Answers:


42

许多程序使用这种技术,其中只有一个可执行文件会根据其执行方式更改其行为。

程序内部通常有一个称为case / switch语句的结构,该结构确定调用可执行文件的名称,然后将为该可执行文件名称调用适当的功能。该名称通常是程序接收的第一个参数。例如,在C您编写时:

int main(int argc, char** argv)

argv[0]包含被调用可执行文件的名称。至少,这是所有shell的标准行为,所有使用参数的可执行文件都应意识到这一点。

Perl中的示例

这是我在Perl中编写的人为设计示例,也演示了该技术。

这是实际的脚本,称之为mycmd.pl

#!/usr/bin/perl

use feature ':5.10';

(my $arg = $0) =~ s#./##;

my $msg = "I was called as: ";

given ($arg) {
  $msg .= $arg  when 'ls';
  $msg .= $arg  when 'find';
  $msg .= $arg  when 'pwd';
  default { $msg = "Error: I don't know who I am 8-)"; }
}

say $msg;
exit 0;

这是文件系统设置:

$ ls -l
total 4
lrwxrwxrwx 1 saml saml   8 May 24 20:49 find -> mycmd.pl
lrwxrwxrwx 1 saml saml   8 May 24 20:34 ls -> mycmd.pl
-rwxrwxr-x 1 saml saml 275 May 24 20:49 mycmd.pl
lrwxrwxrwx 1 saml saml   8 May 24 20:49 pwd -> mycmd.pl

现在,当我运行命令时:

$ ./find 
I was called as: find

$ ./ls
I was called as: ls

$ ./pwd
I was called as: pwd

$ ./mycmd.pl 
Error: I don't know who I am 8-)

另请参阅:ssh-argv0
约旦

4
实际上,这就是BusyBox的工作方式。它具有一个充当大多数通用GNU实用程序的二进制文件。
假名称

1
的参数main是相反的。argc来过argv
巴库里

4
在C语言中,您不能使用字符串创建switch语句。
BatchyX

3
为“我不知道我是谁” +1 :)
CVn
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.