Странное поведение скрипта, когда shebang ссылается на другую оболочку
Я недавно переключился на оболочку ksh93. Я сделал это, добавив следующие две строки в мой файл.profile
export SHELL=/usr/local/bin/ksh93
exec $SHELL
С тех пор, как я это сделал, некоторые простые сценарии начали плохо себя вести, и я не понимаю. Я сузил его до следующего простого сценария под названием сказать test.sh
#!/bin/ksh
echo $0 $1
Если я наберу команду test.sh fred
Я ожидаю увидеть тот же результат test.sh fred
, Вместо этого я вижу test.sh noglob
, Если я уберу Шебанг или поменяю его на #!/usr/local/bin/ksh93
тогда скрипт работает как положено.
Кто-нибудь может объяснить, что происходит или что с этим делать? Я в тупике.
Я использую Solaris 5.9, если это имеет какое-либо значение.
2 ответа
Я заметил из комментариев, что ваш .kshrc
имеет set noglob
, set
Команда без параметров установит параметры командной строки, поэтому $1
это "Ноглоб", это должно быть set -o noglob
,
Кстати, настройка noglob
странно, ты уверен, что хочешь этого?
Я подозреваю (как уже упоминали другие), что /bin/ksh
это оболочка Корн 88.
Существует важное различие между ksh88 и ksh93 в отношении .kshrc
, На кш88 .kshrc
выполняется для каждого процесса оболочки korn, даже неинтерактивных (скриптов). В кш93 .kshrc
не выполняется для сценариев оболочки, только для интерактивных оболочек входа в систему.
Когда вы делаете exec $SHELL
это не оболочка входа в систему, лучше изменить вашу запись в /etc/passwd
, Кстати, используя переменную SHELL
это плохая идея, так как это устанавливается оболочкой входа в систему.
Вероятно, в вашей системе есть псевдоним ksh с noglob, установленным в качестве опции, или noglob передается как параметр по умолчанию в вашей старой оболочке по умолчанию. Вы также должны проверить, какой ksh вы действительно вызываете (проверьте, есть ли ссылка на другую оболочку из /bin/ksh). ksh - версия также должна дать некоторое представление.
В качестве последнего пункта, вместо непосредственного вызова оболочки, я бы порекомендовал использовать
#!/usr/bin/env ksh