我发誓我以前见过这个,但现在找不到。是否有可能让shell脚本启动python interpeter“mid stream”,即:
#!/bin/bash
#shell stuff..
set +e
VAR=aabb
for i in a b c; do
echo $i
done
# same file!
#!/usr/bin/env python
# python would be given this fd which has been seek'd to this point
import sys
print ("xyzzy")
sys.exit(0)
答案 0 :(得分:8)
您可以使用此shell语法(在Unix文献中称为 here document ):
#!/bin/sh
echo this is a shell script
python <<@@
print 'hello from Python!'
@@
'&lt;&lt;&lt;'后面的标记运算符可以通过任意标识符,人们经常使用EOF(文件结尾)或EOD(文档结尾)之类的东西。如果标记开始一行,则shell将其解释为程序的输入结束。
答案 1 :(得分:3)
如果您的python
脚本非常短。您可以使用python
选项将其作为字符串传递给-c
:
python -c 'import sys; print "xyzzy"; sys.exit(0)'
或者
python -c '
import sys
print("xyzzy")
sys.exit(0)
'
答案 2 :(得分:2)
你可以写
exec python <<END_OF_PYTHON
import sys
print ("xyzzy")
sys.exit(0)
END_OF_PYTHON
用Python替换Bash进程,并在其标准输入上将指定的程序传递给Python。 (exec
取代了Bash流程。<<END_OF_PYTHON
会导致标准输入包含END_OF_PYTHON
之前的所有内容。)
答案 3 :(得分:0)
当然,在我发布这篇文章之后,我想起了一种方法:
#!/bin/sh
echo Shell
python <<EOF
import sys
print "Python"
sys.exit(0)
EOF
答案 4 :(得分:0)
我同意混合/混搭可能是一种非常强大的技术 - 不仅在脚本中而且在命令行中(例如,perl内联器已被证明随着时间的推移非常成功)。所以我在bash / python中混合脚本的另一个单行变体(除了kev提到)的小技巧:
for VAR in $(echo 'import sys; print "x y z"; sys.exit(0)' | python -);do echo "$VAR"; done;
产生
x
y
z
答案 5 :(得分:0)
这对于简短的内联脚本/代码非常有用。如果可以依靠bash脚本作为合适的粘合剂来编写一个大型的优秀应用程序,那么可以让不同的团队成员用他们擅长的任何语言编写代码/脚本,然后可以简单地将他们的工作绑定如下。当然,人们还必须假设一个应用程序可以使用这么多不同的运行时。 @ user318904 @phs @piokuc
#!/bin/bash
java hello
#hello class bytecode to be in the path
python hello.py
elixir simple.exs
perl hello.pl
nodejs sum1.js
coffee sum2.coffee
#any other bash script can be put anywhere