2015-02-23 2 views
-1

мои скрипты разрабатываются с использованием притон линии, как «#!/Bin/KSH» и оболочки по умолчанию является $ echo $SHELL /bin/kshИспользуется ли использование скриптов в строке shebang, отличной от оболочки по умолчанию, для беспокойства?

Я двигаюсь все эти сценарии, не изменяя притон линии на новую машину, где оболочка по умолчанию $ echo $SHELL /bin/bash

Должен ли я беспокоиться об этом?

Я предполагаю, что не должно быть никаких проблем, поскольку строка shebang будет переопределять интерпретатор и использовать ksh, как определено в сценариях, и как я хочу, чтобы это было.

Пожалуйста, поделитесь своими мыслями ..

+1

Вы правы: линия shebang выполняется на любом вызове 'execve()'. Только если вы используете сценарии, вам нужно ухаживать за тем, от кого они вызваны. –

+0

Или если указанный интерпретатор не существует или не является исполняемым или другой странностью. –

ответ

1

По умолчанию оболочка не влияет на выполнение сценариев (если только вы не используете оболочку, которая делает что-то очень странное).

Исполняемый скрипт без линии #! будет выполнен с /bin/sh. На самом деле это не кажется правильным, но в любом случае вам не о чем беспокоиться.

Пока ваши скрипты начинаются с #!/bin/kshи вы выполняете их нормально, то система будет выполнять их, передавая их /bin/ksh.

Одна вещь, которую вы может нужно беспокоиться о том, есть ли /bin/ksh, и если да, то какой это. В моей системе (Linux Mint 17) /bin/ksh символическая ссылка на /etc/alternatives/ksh, которая, в свою очередь, символическая ссылка на /bin/ksh93.

Сценарии с #!/bin/ksh, вероятно, достаточно часто, что почти все UNIX-подобные системы будут обслуживать их и установит что-то, который ведет себя как KSH в этом месте.

Обратите внимание, что то, что вы называете «оболочкой по умолчанию», указанной в $SHELL, не является общесистемным по умолчанию. Это просто значение конкретной переменной среды.Эта переменная установлена ​​для каждого пользователя при входе в систему на основе оболочки, указанной в /etc/passwd или ее эквиваленте; поэтому разные пользователи могут иметь разные оболочки по умолчанию. Вы можете изменить значение $SHELL после входа в систему. Запись в /etc/passwd или ее эквивалент устанавливается при создании учетной записи и может быть изменена позже. Большинство систем имеют стандартную пользовательскую оболочку, установленную для новых учетных записей, если не указана оболочка (например, большинство пользователей Linux-систем /bin/bash).

+0

Большое спасибо за подробное разъяснение Keith – Kevin

+1

Скрипт без '#!' Будет выполнен с '/ bin/sh' на zsh и тире, но с текущая оболочка по ksh, bash и ash. –

+0

@thatotherguy: Интересно, спасибо за исправление. Конечно, если вы всегда используете '#!', Вам не нужно беспокоиться об этом. –

0

Предположение дано правильно: притон линия почитается на любой execve() вызова. Только если ваши сценарии получены (. yourscript или source yourscript) или вам не хватает действительного shebang, вам нужно ухаживать за тем, с какого из них вызывается интерпретатор.

Если это неверно, скрипты в не-shell-языках не будут работать должным образом (поскольку интерпретатор Python, например, равен , никогда не).

+0

Спасибо за разъяснение Чарльз – Kevin

0

Ядро будет использовать притон линию, чтобы выбрать соответствующий интерпретатор для использования при выполнении сценария в порядке, по умолчанию, является ли это sh, bash, ksh, expect, python, или любой другой. Единственная реальная проблема, которую следует опасаться, - это скрипты, написанные в системе, где sh - это одна конкретная оболочка (например, bash), которые затем перемещаются в другую систему, где sh - это другая оболочка (например, тире), поскольку они могут использовать функции оболочки, найденные в прежние, которых нет в последнем.

+0

Большое спасибо за разъяснение lgnacio – Kevin

Смежные вопросы