размышления о фиксированном количестве параметров у exec
Александр Петросян (PAF) 31.05.2006 21:33
/ 31.05.2006 21:35
[конечно, не забываем про параметры с «;» внутри!]
когда делал, сначала хотел сделать так же просто, как в perl "system", чтобы передавалась «командная строка».
однако тогда запускается лишний процесс «интерпретатора командной строки» (читай, sh[ell]).
этого хотелось избежать, соответственно, пришлось бы возиться с разбором кавычек и апострофов.
все помнят, что параметры нельзя по пробелам разобрать?
что бывают всякие
-C "file name"
соответственно, бывает и дальше по списку:
-C file\ name
-C "file'name"
-C 'file"name'
-C "file\"name"
и прочие вариации.
обязательно бы пришёл кто-нибудь, кто бы заявил, что сочетание "\/'\/'\/" не отрабатывается «корректно», и настаивал на срочном исправлении.
соответственно, решил, что этой радости мне не нужно, и предложил передать отдельные параметры программе отдельными параметрами функции. просто, понятно, логично.
наконец, предположил, что количество параметров у программы — вещь ясная и фиксированная.
моя позиция:
есть внешний скрипт, которому нужно много данных на входе.
как это принято в unix, этот скрипт принимает их на потоке стандартного ввода и проблем у него нет: parser может передать $.stdin[эти данные].
если не так, и если скрипт наш собственный, то мы прекрасно понимаем, что можно пользоваться переменными окружения. они имеют красивые имена и не надо возиться с разбором ключиков и их значений.
если скрипт чужой и хочет странного, всегда можно написать однострочный shell скрипт, который будет принимать значения из environment и передавать их ниже по течению в том виде, в котором того хочет странный скрипт:
^file::exec[/exec/assign_geonumber.sh;
$.ENDUSER_ID(6742403)
$.GEONUMBER[+440000000001]
]
assign_geonumber.sh:
#!/bin/sh
/path/to/external/assign_geonumber -abonent $ENDUSER_ID -gnumber $GEONUMBER
все помним, что у shell языка есть и циклы и всё, что пожелаешь, чтобы удовлетворить пожелания любых странных внешних скриптов.
скрипты, придерживающиеся стандартного в unix подхода с большим объемом данных на stdin, в этом не нуждаются и запускаются по file::exec на раз.