Mengapa restart, shutdown dan poweroff symlink ke systemctl?

28

Di Arch Linux, jika saya lakukan ls -ldi /sbin, saya dapat melihat bahwa reboot, shutdowndan poweroffsemua symlink untuk /usr/bin/systemctl. Tetapi mengeluarkan reboot, shutdowndan systemctlperintah jelas tidak semua memiliki perilaku yang sama.

Apakah ls -ltidak menunjukkan saya informasi lengkap mengenai symlink? Bagaimana saya, misalnya, bisa tahu apa sebenarnya symlink rebootitu?

Gradien
sumber
1
Untuk lebih lanjut tentang ini, lihat unix.stackexchange.com/a/196014/5132 .
JdeBP

Jawaban:

42

Banyak program memanfaatkan teknik ini di mana ada satu executable yang mengubah perilakunya berdasarkan bagaimana itu dieksekusi.

Biasanya ada struktur di dalam program yang disebut pernyataan case / switch yang menentukan nama yang dapat dieksekusi dipanggil dan kemudian akan memanggil fungsionalitas yang sesuai untuk nama yang dapat dieksekusi itu. Nama itu biasanya argumen pertama yang diterima program. Misalnya, Cketika Anda menulis:

int main(int argc, char** argv)

argv[0]berisi nama yang dapat dieksekusi disebut. Setidaknya, ini adalah perilaku standar untuk semua shell, dan semua executable yang menggunakan argumen harus menyadarinya.

Contoh dalam Perl

Berikut ini adalah contoh yang saya buat di Perl yang menunjukkan tekniknya juga.

Ini skrip yang sebenarnya, sebut saja 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;

Inilah pengaturan sistem file:

$ 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

Sekarang ketika saya menjalankan perintah saya:

$ ./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-)
slm
sumber
Lihat juga:ssh-argv0
jordanm
4
Ini sebenarnya cara BusyBox bekerja. Ini memiliki biner tunggal yang bertindak sebagai sebagian besar utilitas GNU umum.
Nama Palsu
1
Argumen untuk maindibalik. argcdatang sebelumnya argv.
Bakuriu
4
di C, Anda tidak bisa membuat pernyataan beralih dengan string.
BatchyX
3
+1 untuk "Saya tidak tahu siapa saya" :)
a CVn