Arch Linux에서 ls -l
를 실행 하면 , 및 가 심볼릭 링크임을 /sbin
알 수 있습니다 . 그러나 , 및 명령을 실행하는 것이 모두 동일한 동작을 갖는 것은 아닙니다.reboot
shutdown
poweroff
/usr/bin/systemctl
reboot
shutdown
systemctl
ls -l
심볼릭 링크에 대한 완전한 정보가 표시되지 않습니까 ? 예를 들어, 실제 심볼릭 링크가 무엇인지 어떻게 알 수 있나요 reboot
?
답변1
많은 프로그램이 실행 방법에 따라 동작을 변경하는 실행 파일이 있는 이 기술을 사용합니다.
프로그램 내부에는 일반적으로 호출 실행 파일의 이름을 결정한 다음 해당 실행 파일 이름에 적합한 함수를 호출하는 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-)