Tại sao các liên kết khởi động lại, tắt máy và poweroff đến systemctl?


28

Trong Arch Linux, nếu tôi làm ls -ltrong /sbin, tôi có thể thấy rằng reboot, shutdownpowerofftất cả đều liên kết tượng trưng đến /usr/bin/systemctl. Nhưng ban hành reboot, shutdownsystemctlcác lệnh rõ ràng là không tất cả đều có hành vi tương tự.

Không ls -lhiển thị cho tôi thông tin đầy đủ về liên kết tượng trưng? Làm thế nào tôi có thể, ví dụ, biết symlink thực sự rebootlà gì?


1
Để biết thêm về điều này, xem unix.stackexchange.com/a/196014/5132 .
JdeBP

Câu trả lời:


42

Nhiều chương trình sử dụng kỹ thuật này trong đó có một thực thi duy nhất thay đổi hành vi của nó dựa trên cách nó được thực thi.

Thông thường có một cấu trúc bên trong chương trình được gọi là câu lệnh case / switch xác định tên mà tệp thực thi được gọi và sau đó sẽ gọi chức năng phù hợp cho tên thực thi đó. Tên đó thường là đối số đầu tiên mà chương trình nhận được. Ví dụ: Ckhi bạn viết:

int main(int argc, char** argv)

argv[0]chứa tên của thực thi được gọi. Ít nhất, đây là hành vi tiêu chuẩn cho tất cả các shell và tất cả các tệp thực thi sử dụng các đối số nên được biết về nó.

Ví dụ trong Perl

Đây là một ví dụ giả định tôi kết hợp với Perl, nó cũng cho thấy kỹ thuật này.

Đây là kịch bản thực tế, gọi nó 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;

Đây là thiết lập hệ thống tập tin:

$ 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

Bây giờ khi tôi chạy các lệnh của mình:

$ ./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-)

Xem thêm:ssh-argv0
jordanm

4
Đây thực sự là cách BusyBox hoạt động. Nó có một nhị phân duy nhất hoạt động như hầu hết các tiện ích GNU phổ biến.
Tên giả

1
Các đối số mainđược đảo ngược. argcđến trước argv.
Bakuriu

4
trong C, bạn không thể tạo câu lệnh chuyển đổi bằng chuỗi.
BatchyX

3
+1 cho "Tôi không biết mình là ai" :)
CVn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.