我想将短python脚本的文本嵌入到bash脚本中,例如my.bash_profile
。做这种事最好的办法是什么?
到目前为止,我的解决方案是使用-c
选项调用python解释器,并告诉解释器从exec
读取的内容。从那里,我可以构建如下简单的工具,允许我处理在交互式提示中使用的文本:
function pyexec() {
echo "$(/usr/bin/python -c 'import sys; exec sys.stdin.read()')"
}
function traildirs() {
pyexec <<END
trail=int('${1:-3}')
import os
home = os.path.abspath(os.environ['HOME'])
cwd = os.environ['PWD']
if cwd.startswith(home):
cwd = cwd.replace(home, '~', 1)
parts = cwd.split('/')
joined = os.path.join(*parts[-trail:])
if len(parts) <= trail and not joined.startswith('~'):
joined = '/'+joined
print joined
END
}
export PS1="\h [\$(traildirs 2)] % "
不过,这种方法对我来说有点滑稽,我想知道用这种方法做什么可以替代。
我的bash脚本编写技能还很初级,所以我特别想知道我是否从bash解释器的角度做了一些愚蠢的事情。
为什么需要使用
-c
?这对我有效:不需要任何额外的东西。
python解释器在命令行上接受
-
作为stdin
的同义词,因此您可以将对pyexec的调用替换为:请参见命令行引用here。
使用bash
here document
的一个问题是,脚本随后会在stdin
上传递给Python,因此如果您想使用Python脚本作为过滤器,它会变得很笨拙。一种替代方法是使用bash
的process substitution
,如下所示:如果脚本太长,也可以在paren中使用
here document
,如下所示:在脚本中,您可以像平常一样从/到标准i/o进行读/写(例如,
sys.stdin.readlines
以吸收所有输入)。另外,
python -c
也可以像其他答案中提到的那样使用,但这里是我希望在遵循Python的缩进规则(credits)的同时,能够很好地格式化的方法:只要确保文档中每行的第一个字符都是硬标签。如果你必须把它放在一个函数中,那么我使用下面的技巧,让它看起来对齐:
相关问题 更多 >
编程相关推荐