Странное поведение скрипта, когда 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
Другие вопросы по тегам