Пространство между # и! в Шебанге (#!/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 или другой сторонний клон), и (к вашему непосредственному пониманию) обеспечит поддержку замены процесса.

Другие вопросы по тегам