2009-04-16 2 views
1

Делает вид, что у меня есть программа, которая нуждается в окружении. Давайте просто притворимся, что он Perl, и я хочу изменить среду (для поиска в библиотеках специального места). Каждый раз, когда я воюю со стандартным способом делать что-то в UNIX, я плачу тяжелую цену, и я плачу за гибкость. Я знаю, что, используя простой скрипт оболочки, я добавлю дополнительный процесс в дерево процессов. Любой процесс, получающий доступ к его собственному дереву процессов, может быть выброшен за небольшой цикл. Все, что рекурсивно к нетривиальному пути, должно было бы защищаться от множественных расширений среды. Все, что похоже на то, что находится в трубе программ (или закрытие и открытие STDIN, STDOUT или STDERR), является моей самой большой проблемой. Что я делаю с собой?Ловушки использования сценариев оболочки для обертывания программы?

ответ

3

Что я буду делать с собой?

Как вы себя чувствуете?

Обертка программы в скрипте оболочки для настройки среды на самом деле довольно стандартная, и риск довольно минимален, если вы не пытаетесь что-то сделать действительно странный.

Если вы действительно обеспокоены тем, что еще один процесс - и процессы UNIX очень дешевы, по дизайну - используйте ключевое слово exec, которое вместо разветвления нового процесса просто выполняет новый исполняемый файл exec вместо текущий. Итак, где вы, возможно, имели

#!/bin/bash - 
FOO=hello 
PATH=/my/special/path:${PATH} 
perl myprog.pl 

Вы бы просто сказать

#!/bin/bash - 
FOO=hello 
PATH=/my/special/path:${PATH} 
exec perl myprog.pl 

и запасной процесс уходит.

Этот трюк, однако, почти никогда не стоит беспокоить; один контрпример, что если вы не можете изменить оболочку по умолчанию, это полезно сказать

$ exec zsh 

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

+0

Я думаю, что согласен с этим. Я очень переживаю. – ojblass

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