ทำไม reboot, shutdown และ poweroff symlink ถึง systemctl?


28

ในซุ้มลินุกซ์ถ้าผมทำls -lใน/sbinผมจะเห็นว่าreboot, shutdownและpoweroffมี symlinks /usr/bin/systemctlทั้งหมดเพื่อ แต่ออกreboot, shutdownและsystemctlคำสั่งเห็นได้ชัดไม่ทุกคนมีพฤติกรรมเดียวกัน

จะls -lไม่แสดงข้อมูลทั้งหมดเกี่ยวกับ symlink ให้ฉันหรือไม่ ยกตัวอย่างเช่นฉันจะรู้ได้อย่างไรว่า symlink ที่แท้จริง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
jordanm

4
นี่เป็นวิธีการทำงานของ BusyBox มันมีไบนารีเดียวที่ทำหน้าที่เป็นยูทิลิตี้ GNU ทั่วไปส่วนใหญ่
ชื่อปลอม

1
อาร์กิวเมนต์ของmaina ถูกย้อนกลับ มาก่อนargc argv
Bakuriu

4
ใน C คุณไม่สามารถสร้างคำสั่ง switch ด้วยสตริงได้
BatchyX

3
+1 สำหรับ "ฉันไม่รู้ว่าฉันเป็นใคร" :)
CVn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.