web-dev-qa-db-ja.com

再起動、シャットダウン、電源オフがsystemctlへのシンボリックリンクになるのはなぜですか?

Arch Linuxでは、ls -l/sbinを実行すると、rebootshutdownおよびpoweroffがすべて/usr/bin/systemctlへのシンボリックリンクであることがわかります。ただし、rebootshutdown、およびsystemctlコマンドを発行しても、すべての動作が同じになるわけではありません。

ls -lにシンボリックリンクに関する完全な情報が表示されていませんか?たとえば、rebootの本当のシンボリックリンクを知るにはどうすればよいですか?

28
Gradient

多くのプログラムはこの手法を利用しており、実行方法に基づいて動作を変更する単一の実行可能ファイルがあります。

通常、プログラム内には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-)
42
slm