bash4.3 # pwd
/bin
bash4.3 # ll sh
lrwxrwxrwx. 1 root root 4 May 17 22:22 sh -> bash
bash4.3 # ll bash
-rwxr-xr-x. 1 root root 1072056 May 17 22:22 bash
bash4.3 # bash
bash4.3 # sh
sh-4.3#
Моя ОС Fedora 24 (версия GNOME по умолчанию).
Из примера мы можем узнать: under /bin
, bash
это двоичный исполняемый файл; sh
это мягкая ссылка на bash
.
Так что, насколько мне известно, type bash and press enter
должен получиться такой же результат, как и type sh and press enter
.
Когда я type bash and press enter
, я получаю, [root@localhost bin]#
как ожидалось.
Однако, если я type sh and press enter
, я на удивление получаю sh-4.3#
.
В чем причина?
Ответы:
Это документированная особенность.
Если вы запустите bash по символической ссылке
sh
, bash запустится вsh
режиме совместимости.От
man bash
:Как программа узнает, какое имя использовалось для ее запуска?
Если это программа переменного тока, она может проверить
argv[0]
. Если это сценарий оболочки или Perl, он может проверить$0
.В качестве примера, давайте рассмотрим этот простой сценарий оболочки:
$0
это имя, по которому скрипт был вызван.${0##*/}
Имя, из которого был вызван скрипт с удаленными именами каталогов.Давайте создадим эту символическую ссылку:
Таким образом,
utc
иet
как запустить тот же исполняемый файл , но они дают разные результаты. При запуске какutc
, он выводит универсальное время. При запуске aset
выводит восточное время США. Например:источник
argv[0]
, obvs)