2016-08-11 5 views
1

Может кто-нибудь объяснить, как работает этот скрипт bash? Часть, которую я не понимаю, это """:", что означает этот синтаксис в bash?Как написать скрипт bash, который вызывает себя с помощью python?

#!/bin/sh 

""":" 

echo called by bash 
exec python $0 ${1+"[email protected]"} 

""" 

import sys 
print 'called by python, args:',sys.argv[1:] 

результат теста работает:

$ ./callself.sh xx 
called by bash 
called by python, args: ['xx'] 


$ ./callself.sh 
called by bash 
called by python, args: [] 

ответ

2

Это умный! В Bash, """:" будет расширен только в :, который является пустой командой (он ничего не делает). Итак, следующие несколько строк будут выполнены, что приведет к exec. В этот момент Bash перестает существовать, и файл перечитывается Python (его имя $0), и исходные аргументы пересылаются.

${1+"[email protected]"} означает: Если определено $1, отправьте в качестве аргументов "[email protected]", которые являются исходными аргументами сценария Bash. Если $1 не определен, то есть у Bash не было аргументов, результат пуст, поэтому ничего не передается, даже пустая строка.

В Python, то """ начинает строку многострочных, которая включает в себя команду Bash, и простирается до закрытия """. Таким образом, Python будет прыгать прямо внизу.

1

Это пример для polyglot, где вы пишете несколько языков программирования в файле и по-прежнему действуете.

Как это действует в питона

""":" 

echo called by bash 
exec python $0 ${1+"[email protected]"} 

""" 

Это многострочный строка документации в питона так питон полностью игнорирует его до import линии

Как это действует в Баш

""":" 

echo called by bash 
exec python $0 ${1+"[email protected]"} 

exec calls тот же скрипт с использованием интерпретатора python и выходит из сценария. Таким образом, он не будет выполнять оставшиеся синтаксически неправильные инструкции python.

Смежные вопросы