LINUX.ORG.RU
ФорумTalks

Вешается ли у вас этот двухстрочник на баше?


0

0
#!/usr/bin/env FOO=bar bash
echo "Hello, world!"

Сохраняем в любой файл, даём права на выполнение и выполняем сам файл. Лично у меня Hello, world! так и не появляется на экране, но gkrellm начинает показывать 50% загрузку процессора. Где меня Баллмер попутал на этот раз?

Ответ на: комментарий от melkor217

Спасибо, но мне интересно именно поведение /usr/bin/env. В мане сказано, что так можно. Может быть, я багрепорт написать хочу? )

RommeDeSerieux
() автор топика
Ответ на: комментарий от DonkeyHot

Не суть. Просто выбрал bash как нечто самое простое. Оригинал был на питоне, а вешается оно, даже я оставлю лишь одну строчку с #!

RommeDeSerieux
() автор топика
Ответ на: комментарий от RommeDeSerieux

И у меня не вешается. Тут просто явно указан интерпретатор, он игнорирует первую строчку.

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

> слака форева:)

на убунте тоже, тоже работает!! шаттлворт - бог!!!

melkor217 ★★★★★
()

Не будет работать. Потому что у команды, указываемой в шебанге, может быть только один аргумент. В данном случае в /usr/bin/env передаётся аргумент "FOO=bar bash", то есть переменной FOO присваивается значение "bar bash" и возвращается полученное окружение. Проверить это можно как-нибудь так:

[code]> cat myenv.sh #!/bin/sh echo arg1: $1 /usr/bin/env "$@" [/code]

[code]> cat test.sh #!/home/laz/tmp/myenv.sh FOO=bar bash echo "Hello, world!" [/code]

В итоге получаем:

[code] > ./test.sh arg1: FOO=bar bash arg1: FOO=bar bash arg1: FOO=bar bash arg1: FOO=bar bash ... [/code]

Почему зацикливается, не знаю, но уверен, что этому есть логичное объяснение, только искать почему-то лень.

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

Что такое.. Как там код правильно форматировать, не знаю.
Что-то такое должно быть:

>cat myenv.sh
#!/bin/sh
echo arg1: $1
/usr/bin/env "$@"

>cat test.sh
#!/home/laz/tmp/myenv.sh FOO=bar bash
echo "Hello, world!" 

>./test.sh 
arg1: FOO=bar bash 
arg1: FOO=bar bash 
arg1: FOO=bar bash 
arg1: FOO=bar bash
...

Laz ★★★★★
()

rm: невозможно удалить `/bin/dd': Permission denied
rm: невозможно удалить `/bin/cp': Permission denied
rm: невозможно удалить `/bin/df': Permission denied
rm: невозможно удалить `/bin/ed': Permission denied

...

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

Думаю, все можно свести к однострочнику:

#!/usr/bin/env

При вызове интерпретатора команд через шебанг (#!) ядро само дополнительным аргументом указывает имя файла, где лежит скрипт. То есть запускается /usr/bin/env и ему параметром дается имя файла. Он считает, что это команда и делает exec().

mky ★★★★★
()

> #!/usr/bin/env FOO=bar bash

man 2 execve

ядро не парсит #! строку. Все после первого пробела фигачится как один аргумент.

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

Круто. Оказывается, env довольно умён. Из шебанга ему приходит что-то вроде

$ env /home/user/script.sh bash

и он соображает, что к чему.

p.s. А вообще, могли бы и учесть этот случай.

p.p.s. Ещё можно было бы научить ядро передавать имя файла последним аргументом, а не первым. Тогда не надо было бы усложнять env.

p.p.p.s А фича-то сомнительная весьма..

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