在bash脚本中嵌入短python脚本

2024-06-26 10:33:55 发布

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

我想将简短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解释器的角度来看,我是否在做一些愚蠢的事情


Tags: 方法文本import脚本bashhomeosstdin
3条回答

使用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"
}

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

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

不需要任何额外的东西

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

python - <<END

请参阅命令行参考here

相关问题 更多 >