LINUX.ORG.RU

вопрос про шибэнг


0

0

из любопытства возник вопрос что нужно поставить в #! перлового скрипта, чтобы он нашел путь к перлу производя поиск в PATH.

Есть рецепт: #/usr/bin/env perl

Это работает. Но нет гарантии что сам env будет в /usr/bin Собственно, единственную более-менее гарантию что я знаю это /bin/sh

Соответственно попытался поставить: #!/bin/sh -c perl

Это не работает. Потому что вызывается /bin/sh -c perl prog, а нужно /bin/sh -c 'perl prog'

Ну я парень не промах, и сделал #!/bin/sh -c 'perl $1'

Но это тоже не работает. Потому что sh -с command ожидает сперва имя процесса, и только потом аргументы.

Отлично. Делаю #!/bin/sh -c 'perl $1' xxx

Но это тоже не работает, уже по непонятным причинам. То что я хочу как-то можно вообще сделать?:)

★★★★★

> Отлично. Делаю #!/bin/sh -c 'perl $1' xxx

> Но это тоже не работает, уже по непонятным причинам.
> То что я хочу как-то можно вообще сделать?:) 

[tmp]> cat test.c 
#include <stdio.h>

int main(int argc, char** argv) {
 printf("argc: %i\n", argc);
 int i = 0;
 while (i < argc) printf("%s\n", argv[i++]);
 return 0;
};
[tmp]> gcc test.c 
[tmp]> cat test
#!/tmp/a.out -a 1 -b 2
[tmp]> ./test 
argc: 3
/tmp/a.out
-a 1 -b 2
./test

Видно, что всё, что идёт в качестве аргументов, передаётся одним параметром,
как если бы был вызов ./a.out '-a 1 -b 2' ./test.
Поэтому вариант с /bin/sh -c наверняка не прокатит.

Ответа на вопрос не знаю... буду рад толковым ссылкам по теме.

Jini ★★
()
Ответ на: комментарий от Jini

в принципе поведение логично: не кернельное это дело парсингом строки заниматься.

В man execve есть указание:

For portable use, optional-arg should either be absent, or be specified as a single word (i.e., it should not contain white space)

dilmah ★★★★★
() автор топика

с tcl этот фокус выполняется следующим образом :

#!/bin/sh
# the next line restarts using tclsh \
exec tclsh "$0" "$@"
proc native_tcl_script_follows {} {}

но это связанно с разницей в обработке строк комментариев
sh и tclsh...возможно подобный фокус должен быть и для перл

зы. imho правильный путь это напрямую указывать #!/usr/bin/perl
если перл есть в системе, то по всем стандартам, он там...

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

поисследовал: такого типа фишки по научному называются /bin/sh trampoline.

Для перла такое без временных файлов не выйдет -- потому что у перла
есть такая "фича" -- если ему дают исполнить файл который он считает
шелловским, то он сам екзекает шелл -- так что получается бесконечный
цикл exec'ов

$ cat a.pl
#!/bin/sh

if true; then
    echo "hahaha -- we are in shell"
fi

$ perl a.pl
hahaha -- we are in shell


dilmah ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.