Багато програм використовують цю техніку там, де є єдиний виконуваний файл, який змінює свою поведінку залежно від того, як вона була виконана.
Зазвичай у програмі є структура, яка називається оператором 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-)