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


28

私がしなければアーチLinuxでは、ls -l/sbin、私はそれを見ることができるrebootshutdownpoweroffのすべてのシンボリックリンクです/usr/bin/systemctl。ただし、、およびコマンドを発行してもreboot、すべてが同じ動作をするわけではありません。shutdownsystemctl

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


1
詳細については、unix.stackexchange.com / a / 196014/5132を参照してください。
JdeBP

回答:


42

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

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

参照:ssh-argv0
ヨルダン

4
これが実際にBusyBoxが機能する方法です。一般的なGNUユーティリティのほとんどとして機能する単一のバイナリがあります。
偽の名前

1
への引数mainは逆になります。argc前に来るargv
バクリウ

4
Cでは、文字列でswitchステートメントを作成できません。
BatchyX

3
「自分が誰なのかわからない」ための+1 :)
CVn
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.