在bash脚本中嵌入简短的python脚本

2024-06-26 10:51:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我想将短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解释器的角度做了一些愚蠢的事情。


Tags: 文本import脚本bashhomeossysfunction
3条回答

为什么需要使用-c?这对我有效:

python << END
... code ...
END

不需要任何额外的东西。

python解释器在命令行上接受-作为stdin的同义词,因此您可以将对pyexec的调用替换为:

python - <<END

请参见命令行引用here

使用bash here document的一个问题是,脚本随后会在stdin上传递给Python,因此如果您想使用Python脚本作为过滤器,它会变得很笨拙。一种替代方法是使用bashprocess substitution,如下所示:

... | python <( echo '
code here
' ) | ...

如果脚本太长,也可以在paren中使用here document,如下所示:

... | python <(
cat << "END"
code here
END
 ) | ...

在脚本中,您可以像平常一样从/到标准i/o进行读/写(例如,sys.stdin.readlines以吸收所有输入)。

另外,python -c也可以像其他答案中提到的那样使用,但这里是我希望在遵循Python的缩进规则(credits)的同时,能够很好地格式化的方法:

read -r -d '' script <<-"EOF"
    code goes here prefixed by hard tab
EOF
python -c "$script"

只要确保文档中每行的第一个字符都是硬标签。如果你必须把它放在一个函数中,那么我使用下面的技巧,让它看起来对齐:

function somefunc() {
    read -r -d '' script <<-"----EOF"
        code goes here prefixed by hard tab
----EOF
    python -c "$script"
}

相关问题 更多 >