如何复制 bash 对作为参数传递给其他命令的命令的转义
How to replicate bash's escaping on commands passed as arguments to other commands
我将执行命令的结果作为输入传递给 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 ...)"
转换成的内容,以便它能够将整个输出作为单个命令行条目传递。
I am struggling to find a way to replicate the escaping bash does behind the scenes
通常使用 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>
我将执行命令的结果作为输入传递给 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 ...)"
转换成的内容,以便它能够将整个输出作为单个命令行条目传递。
I am struggling to find a way to replicate the escaping bash does behind the scenes
通常使用 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>