如何复制 bash 对作为参数传递给其他命令的命令的转义

dyl*_*oll 0 python bash escaping pycharm

编辑2:有点迟来的编辑来总结对此问题的评论。我误解了 bash 的工作原理,并将其与 python 的工作原理混淆了。我推测 Bash 转义了命令的输出kubectl,因此在传递给 python 命令时它不会被分解为多个参数。(即如何转义 python 字符串中的引号以阻止字符串被分解。)

实际上,当用引号括住命令的输出时,Bash 能够将命令执行的输出作为单个参数传递。它不会逃避任何事情,它也不会尝试解释这一切。我遇到的问题实际上是 PyCharm 缺乏将复杂字符串作为单个参数传递的功能,而 PyCharm 可以将带有空格的字符串解析为多个参数。


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

$ python parse_ips.py "$(kubectl get configmap ...)"
Run Code Online (Sandbox Code Playgroud)

从命令行执行时效果很好,但我现在尝试使用 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
  ...
Run Code Online (Sandbox Code Playgroud)

等等。这显然与以前的工作方式不同。kubectl因此,如果每次不从命令行进行调用,我就无法测试我的程序。我希望复制"$(kubectl ...)"转换后的内容,以便能够将整个输出作为单个命令行条目传递。

Kam*_*Cuk 5

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

通常用于printf "%q"逃避事物。

printf "%q" "$(kubectl get configmap ....)"
Run Code Online (Sandbox Code Playgroud)

这是printfbash 内置命令。它与 coreutils 不同printf,最新的还支持%q不同的引用风格:

/usr/bin/printf "%q" "$(kubectl get configmap ....)"
Run Code Online (Sandbox Code Playgroud)

现代 bash 也有引用扩展:

var="$(kubectl get configmap ....)"
echo "${var@Q}"
Run Code Online (Sandbox Code Playgroud)

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


我建议使用一个文件:

kubectl get configmap ... > /tmp/tempfile
python parse_ips.py "$(cat /tmp/tempfile)"
Run Code Online (Sandbox Code Playgroud)

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

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

# then in another window:
python parse_ips.py <right mouse click><select paste>
Run Code Online (Sandbox Code Playgroud)