首页 > 解决方案 > 如何复制bash对作为参数传递给其他命令的命令的转义

问题描述

我将执行命令的结果作为输入传递给 python,如下所示:

$ python parse_ips.py "$(kubectl get configmap ...)"

从命令行执行时效果很好,但是我现在正在尝试使用 PyCharm 编辑文件。因此我需要这个命令结果的转义版本,我可以将它粘贴到 PyCharm 的调试配置中,因为我不能像在命令行上那样实时执行命令。

但是,我正在努力寻找一种在幕后复制转义 bash 的方法,因此我可以将结果用作 PyCharm 配置中的参数。运行上述kubectl命令会生成一个包含空格和引号的多行字符串。当我将其粘贴到 PyCharm 中时,它只是将其解释为多个参数。我正在寻找转义的结果,我可以将其直接粘贴到命令行中,或者粘贴到 PyCharm 的调试配置中,以使用固定参数来实现相同的结果进行测试。

任何帮助将不胜感激!

编辑:为了澄清,我的意思是在命令行上,当命令的结果$(kubectl ...)被引号 ( ) 包围时,它作为单个命令行参数传递给 python 程序"$(kubectl ...)"。所以在 python 程序中,你可以访问sys.argv[1],它将包含$(kubectl get configmap ...). 但是,如果我自己在命令行上执行该命令,则结果是一个多行字符串。

如果我随后将结果复制到 PyCharm 中(甚至再次在命令行上),它会被解释为许多命令行参数。例如,它看起来像这样:

$ python parse_ips.py apiVersion: v1
data:
  item1: ifconfig-push 127.0.0.0 255.255.0.0
  item2: ifconfig-push 127.0.0.1 255.255.0.0
  item3: ifconfig-push 127.0.0.2 255.255.0.0
  ...

等等。这显然不像以前那样工作。kubectl因此,如果不每次都从命令行进行调用,我将无法测试我的程序。我正在寻找复制"$(kubectl ...)"转换成的内容,以便能够将整个输出作为单个命令行条目传递。

标签: pythonbashpycharmescaping

解决方案


我正在努力寻找一种方法来在幕后复制转义 bash

通常用于printf "%q"逃避东西。

printf "%q" "$(kubectl get configmap ....)"

printf就像 bash 内置命令一样。它与 coreutils 不同printf,最新的也支持%q不同的引用风格:

/usr/bin/printf "%q" "$(kubectl get configmap ....)"

现代 bash 也有引用扩展:

var="$(kubectl get configmap ....)"
echo "${var@Q}"

还有 . 输出的引用样式set -x


我建议使用一个文件:

kubectl get configmap ... > /tmp/tempfile
python parse_ips.py "$(cat /tmp/tempfile)"

您可以将xclip命令输出直接复制到 X 服务器剪贴板,这很方便:

printf "%q" "$(kubectl get configmap ...)" | xclip -selection clipboard

# then in another window:
python parse_ips.py <right mouse click><select paste>

推荐阅读