Использование Python в Bash-скрипте

sed -e 's/\<00*\([1-9]\)/\1/g' input_data

Работает :Это регулярное выражение ищет целое число [0 -9], слева от которого находится строка из нулей, и эти нули ограничены словом -break \<.

19
04.08.2019, 14:17
4 ответа

В дополнение к ответу Кусалананды, если вы хотите, чтобы весь скрипт запускался с помощью python, вы можете просто изменить первую строку на #!/usr/bin/env python3и запустить ее, как любой обычный скрипт оболочки. Таким образом, вам не нужно помнить, какой скрипт вы должны запускать с каким интерпретатором.

19
27.01.2020, 19:44

Вы также можете попробовать оператор<<<(Here Strings )для экономии строк:

$ python <<< 'print("MyTest")'
MyTest
9
27.01.2020, 19:44

Вы также можете установить путь python при вызове файла python из скрипта bash:

export PYTHONPATH=/tmp/python_dep.zip && python test_my.py
1
27.01.2020, 19:44

Чтобы запустить набор команд Python из сценария bash, вы должны дать интерпретатору Python команды для выполнения либо из файла (Сценарий Python ), который вы создаете в сценарии, как в

#!/bin/bash -e

# Create script as "script.py"
cat >script.py <<'END_SCRIPT'
print("TESTPRINT")
END_SCRIPT

# Run script.py
python script.py

rm script.py

(это создает новый файл с именем script.pyили перезаписывает этот файл, если он уже существует, а затем указывает Python запустить его; затем он удаляется)

... или напрямую через какую-либо форму перенаправления, например здесь -документ:

#!/bin/bash

python - <<'END_SCRIPT'
print("TESTPRINT")
END_SCRIPT

При этом запускается python -, который указывает интерпретатору Python прочитать сценарий из стандартного ввода. Затем оболочка отправляет текст сценария Python (, разделенный символом END_SCRIPTв сценарии оболочки ), в стандартный поток ввода процесса Python.

Обратите внимание, что два приведенных выше фрагмента кода незначительно отличаются тем, что процесс Python второго сценария имеет стандартный ввод, связанный со сценарием, который он читает, в то время как процесс Python первого сценария может свободно считывать данные, отличные от сценария, из стандартного Вход. Это имеет значение, если ваш код Python считывается со стандартного ввода.

Python также может напрямую принимать набор команд из командной строки с помощью опции -c:

#!/bin/bash

python -c 'print("TESTPRINT")'

Чего вы не можете сделать , так это "переключиться на Python" в середине сценария bash.

Команды в сценарии выполняются bashодна за другой, и пока команда выполняется, сценарий сам ожидает ее завершения (, если это не фоновое задание ).

Это означает, что исходный сценарий запускает Python в интерактивном режиме, временно приостанавливая выполнение сценария bashдо тех пор, пока процесс Python не завершится. Затем сценарий попытается выполнить print("TESTPRINT")как команду оболочки.

Аналогичная проблема с использованием sshв скрипте:

ssh user@server
cd /tmp
ls

(что, возможно, похоже на то, что, по вашим словам, вы пробовали несколько лет назад ).

Это не для подключения к удаленной системе и выполнения там команд cdи ls. Он запустит интерактивную оболочку в удаленной системе, и после завершения этой оболочки (управление будет возвращено сценарию ), cdи ls, который будет запущен локально.

Вместо этого для выполнения команд на удаленной машине используйте

ssh user@server "cd /tmp; ls"

(Это неубедительный пример, но вы можете понять суть ).


В приведенном ниже примере показано, как вы можете сделать то, что предлагаете. Тем не менее, он поставляется с несколькими предупреждающими метками и предостережениями, и вы никогда не должны писать подобный код (, потому что он запутан и, следовательно, неудобен в сопровождении и, осмелюсь сказать, совершенно плох ).

python -
print("TESTPRINT")

Запуск:

$ sh -s <script.sh
TESTPRINT

Здесь происходит то, что скрипт запускается sh -s. Параметр -sдляshbash)указывает оболочке выполнить сценарий оболочки, поступающий через стандартный поток ввода.

Затем запускается сценарий python -, который указывает Python запускать все, что приходит через стандартный поток ввода. Следующим в этом потоке, поскольку он унаследован от sh -sPython (и, следовательно, связан с нашим текстовым файлом сценария ), является команда Python print("TESTPRINT").

Затем интерпретатор Python продолжит чтение и выполнение команд из файла сценария до тех пор, пока он не закончится или не выполнит команду Python exit().

46
27.01.2020, 19:44

Теги

Похожие вопросы