再起動、シャットダウン、および電源オフがsystemctlにシンボリックリンクされているのはなぜですか?

再起動、シャットダウン、および電源オフがsystemctlにシンボリックリンクされているのはなぜですか?

Arch Linuxでls -l実行すると、およびがシンボリックリンクであることが/sbinわかります。ただし、コマンドを実行することがすべて同じ動作を持つわけではありません。rebootshutdownpoweroff/usr/bin/systemctlrebootshutdownsystemctl

ls -lシンボリックリンクに関する完全な情報は表示されませんか?たとえば、実際のシンボリックリンクが何であるかをどうやって知ることができますかreboot

答え1

多くのプログラムが実行方法に応じて動作を変更する実行可能ファイルを持つこの技術を使用します。

プログラムの内部には通常、呼び出し実行可能ファイルの名前を決定し、その実行可能ファイル名に適した関数を呼び出す case/switch ステートメントと呼ばれる構造があります。この名前は通常、プログラムが受け取る最初の引数です。たとえば、次のようにC書くとき:

int main(int argc, char** argv)

argv[0]呼び出される実行可能ファイルの名前を含みます。少なくともこれはすべてのシェルの標準的な動作であり、引数を使用するすべての実行可能ファイルはそれを知っている必要があります。

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-)

関連情報