Сценарий оболочки меняет оболочку между - PullRequest
2 голосов
/ 27 декабря 2011

У меня есть сценарий оболочки с двумя shebangs, первый говорит #! / Bin / sh, а через несколько строк другой - #! / Usr / bin / env python.

Когда этоСкрипт получает разрешение на выполнение и запускается как ./script.sh, скрипт отлично работает, использует / bin / sh в первой части и использует интерпретатор python во второй части.

Но когда скрипт запускается как sh script.sh, второй шебанг не распознан и скрипт завершается ошибкой.Могу ли я в любом случае принудительно изменить интерпретатор, если скрипт запускается явно как sh script.sh.

Причина, по которой мне это нужно, заключается в том, что мне нужно запустить скрипты через инструмент, который запускается как sh script.ш

Ответы [ 3 ]

3 голосов
/ 27 декабря 2011

Насколько я знаю, вы не можете иметь две shebang строки в одном скрипте.shebang работает только тогда, когда -

  1. в первой строке
  2. начинается в первом столбце

Если вам нужно запустить код Pythonзатем добавьте его в другой скрипт и затем вызовите скрипт, выполнив

python path/to/the/script.py
1 голос
/ 16 ноября 2012

Лучший способ сделать это - использовать оболочку здесь document .Примерно так:

#!/bin/sh
curdir=`pwd`
/usr/bin/env python <<EOF
import os
print os.listdir("$curdir")
EOF

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

Как видите, вы даже можете обращаться к переменным оболочки из кода Python.

0 голосов
/ 27 декабря 2011

ваш скрипт script.sh напрямую вызывает интерпретатор python:

#!/bin/sh
# include full path if needed
python (your python interpreter arguments)
...