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

mspsb9vt  于 2023-05-29  发布在  PyCharm
关注(0)|答案(1)|浏览(176)

编辑2:有点晚的编辑,以总结对这个问题的评论。我误解了bash的工作原理,并将其与python的工作原理混淆。我假设Bash转义了kubectl命令的输出,因此在传递给python命令时不会将其分解为多个参数。(即如何在Python字符串中转义引号以防止字符串被分解。
实际上,当命令的输出用引号括起来时,Bash能够将命令执行的输出作为单个参数传递。它不逃避任何东西,它只是不试图解释它的一切。我遇到的问题实际上是PyCharm缺乏将复杂字符串作为单个参数传递的功能,而PyCharm将带有空格的字符串作为多个参数进行解析。
我将命令的执行结果作为输入传递给python,如下所示:

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

从命令行执行时,这工作正常,但我现在尝试使用PyCharm编辑文件。因此,我需要这个命令结果的转义版本,我可以将其粘贴到PyCharm的调试配置中,因为我不能像在命令行上那样实时执行命令。
然而,我正在努力寻找一种方法来在幕后复制转义的bash,这样我就可以在PyCharm配置中使用结果作为参数。运行上面的kubectl命令会得到一个包含空格和引号的多行字符串。当我把它粘贴到PyCharm中时,它只是把它解释为多个参数。我正在寻找转义的结果,我可以直接将其粘贴到命令行中,或者粘贴到PyCharm的调试配置中,以便使用固定的参数来实现相同的测试结果。
任何帮助将不胜感激!
编辑:澄清一下,我的意思是在命令行上,$(kubectl ...)命令的结果被引号("$(kubectl ...)")括起来时作为单个命令行参数传递到python程序中。因此,在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 ...)"转换成的内容,以便它能够将整个输出作为单个命令行条目传递。

qvtsj1bj

qvtsj1bj1#

我正在努力寻找一种方法来复制逃脱bash做幕后
通常使用printf "%q"来转义内容。

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

这是作为bash内置命令的printf。它与coreutils printf不同,最新的也支持%q,但引用方式不同:

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

Modern 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>

相关问题