我想将简短python脚本的文本嵌入bash脚本中,以便在my.bash_profile
中使用。做这样的事最好的方法是什么
到目前为止,我的解决方案是使用-c
选项调用python解释器,并告诉解释器从stdin
读取任何内容。在此基础上,我可以构建如下简单工具,允许我处理文本,以便在交互式提示中使用:
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解释器的角度来看,我是否在做一些愚蠢的事情
使用bash
here document
的一个问题是,脚本随后会在stdin
上传递给Python,因此如果您想将Python脚本用作过滤器,它将变得非常笨拙。一种替代方法是使用bash
的process substitution
,如下所示:如果脚本太长,也可以在paren中使用
here document
,如下所示:在脚本内部,您可以像平常一样从/到标准i/o进行读/写操作(例如
sys.stdin.readlines
以占用所有输入)另外,
python -c
也可以像其他答案中提到的那样使用,但我喜欢这样做,以便很好地格式化,同时仍然遵守Python的缩进规则(credits):只需确保此处文档中每行的第一个字符是硬制表符。如果必须将其放入函数中,那么我将使用我在某处看到的以下技巧使其看起来对齐:
为什么需要使用
-c
?这对我很有用:不需要任何额外的东西
python解释器接受命令行上的
-
作为stdin
的同义词,因此您可以用以下内容替换对pyexec的调用:请参阅命令行参考here
相关问题 更多 >
编程相关推荐