为什么重启、关机和关机符号链接到 systemctl?

Gra*_*ent 31 ls arch-linux symlink ln reboot

在Arch Linux的,如果我做ls -l/sbin,我可以看到rebootshutdown而且poweroff都是符号连接/usr/bin/systemctl。但是发出reboot,shutdownsystemctl命令显然并不都具有相同的行为。

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

slm*_*slm 45

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

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

int main(int argc, char** argv)
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

这是文件系统设置:

$ 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
Run Code Online (Sandbox Code Playgroud)

现在当我运行我的命令时:

$ ./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-)
Run Code Online (Sandbox Code Playgroud)

  • 这实际上是 BusyBox 的工作原理。它有一个二进制文件,可充当大多数常见的 GNU 实用程序。 (4认同)
  • 在 C 中,您不能使用字符串创建 switch 语句。 (4认同)
  • +1 表示“我不知道我是谁” :) (4认同)