#! / usr / bin / python (sha-bang или she-bang) не работает в bash - PullRequest
1 голос
/ 14 февраля 2012

У меня есть следующее содержимое в файле

demo.py: - // набор исполняемых битов

#!/usr/bin/python
import os

я использовал команду bash demo.py в терминале и ожидая, что первая строка интерпретируется bash и обрабатывает файл в интерпретаторе python.Но он вызывает двоичный файл "/ usr / bin / import" (вычисленный с использованием strace).То же самое с sh demo.py .Однако запуск . / Demo.py работает.man bash говорит:

«Если программа представляет собой файл, начинающийся с # !, в оставшейся части первой строки указывается интерпретатор программы.»

, чего не происходит.

Использование bash версии

$ bash --version

GNU bash, версия 4.2.8 (1) -релиз (i686-pc-linux-gnu) Copyright (C) 2011 Free SoftwareЛицензия Foundation, Inc. GPLv3 +: GNU GPL версии 3 или более поздней http://gnu.org/licenses/gpl.html

Это свободное программное обеспечение;Вы можете изменять и распространять его.НЕТ ГАРАНТИИ, если это разрешено законом.

в Ubuntu 11.04

Ответы [ 4 ]

8 голосов
/ 14 февраля 2012

Документация bash верна: когда вы вводите ./demo.py в командной строке bash, bash использует строку shebang, чтобы выяснить, какой исполняемый файл запустит скрипт.

Когда вы делаете bash demo.py, то, конечно, bash попытается запустить его как скрипт bash.Потому что ты сказал это.(Представьте, если бы у вас был скрипт bash с неверной строкой shebang - как бы вы его запустили? Передав его непосредственно в bash именно таким образом.)

Если вы хотите запустить другую оболочку bash, которая запускаетсяваш сценарий Python, затем используйте bash -c ./demo.py для выполнения demo.py как команду bash , а не как сценарий bash.Но вам не нужно запускать другую оболочку только для запуска скрипта Python.

6 голосов
/ 14 февраля 2012

Я думаю, что вы запутались со значением линии взрыва.

#!/usr/bin/python

Это означает, что ./demo.py будет выполняться как /usr/bin/python demo.py.

Однако, с /bin/bash demo.py, bash попытается интерпретировать demo.py как файл сценария оболочки и потерпит неудачу, то есть python не будет выполнен.

4 голосов
/ 14 февраля 2012

Вам нужно запустить его как bash -c ./demo.py или sh -c ./demo.py, в противном случае каждая строка в файле будет выполняться как команда bash (вместо того, чтобы выполнять файл с помощью she-bang).

0 голосов
/ 11 июля 2013

Кстати, остерегайтесь cut'n'paste из Интернета или документов Windows, CR-LF после shebang не работает хорошо:

=> head -1 myScript.py | od -cx

0000000 #! / u s r / b i n / e n v p

       2123    752f    7273    622f    6e69    652f    766e    7020

0000020 y t h o n \ r \ n

       7479    6f68    0d6e    000a

0000027

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...