Пространство между # и! в Шебанге (#!/usr/bin/ksh)
Я пишу сценарий оболочки Korn, который включает подстановку процесса с использованием < <()
, как это:
array=()
while IFS= read -r -d '' x;do
array+=( "$x" )
done < <(some command)
Это пытается вставить в array
вся строка возвращается some command
, Любопытно, что это работает, когда мой Шебанг выглядит так:
# !/usr/bin/ksh
что, конечно, необычно (обратите внимание на пространство между #
а также !
). С другой стороны, когда мой Шебанг выглядит #!/usr/bin/ksh
(правильный путь, по-видимому), этот скрипт завершается с ошибкой syntax error: '< ' unexpected
, Почему это? Какая разница означает наличие пробела в шебанге? Google дал мне несколько ответов, сказав, что пространство между !#
а также !/usr...
все в порядке, но ничего относительно пространства между !
а также #
,
1 ответ
# !
является недействительным shebang, и полностью игнорируется. Поведение сценария без шебанга зависит от того, как вы его вызываете.
Если вызывается из оболочки: некоторые оболочки используют /bin/sh
запускать такие скрипты; другие используют себя для этой цели. Предположительно, оболочка, которую вы используете в интерактивном режиме при тестировании этого (и обнаружение сценария, работающего только с недопустимым shebang), находится в последнем наборе, так что ваш сценарий фактически запускается с помощью bash или другой активной интерактивной оболочки в данный момент.
Если вызывается без оболочки: большинство операционных систем откажутся выполнять такой двоичный файл.
Настоящий David Korn ksh93 корректно поддерживает подстановку процессов, но некоторые сторонние клоны и древние реализации ksh - нет.
Если вы собираетесь использовать ksh, настоятельно рекомендуется использовать подлинный David Korn ksh93 (не mksh, pdksh или другой сторонний клон), и (к вашему непосредственному пониманию) обеспечит поддержку замены процесса.