我目前正在 centos 7 虚拟机上编写一个 python 脚本,该脚本必须在此过程中执行几个 shell 命令。我找到了一个可以完成这项工作的库,但我在其中一个库上遇到了错误。我从文本文件中获得了这些命令,所以我实际上不知道它们的作用。简单的我都懂,但是这些都超出了我的水平。由于只有 2 行出现错误,我知道这不是脚本本身的问题,而是我如何使用它的问题。./linkerd
是链接器的二进制文件,而 linkerd_images.txt 有一个图像列表:
./linkerd install --ha --ignore-cluster | grep image: | grep linkerd | sed -e 's/^ .*images: //' | sort | uniq >> linkerd_images.txt
./linkerd viz install --ha --skip-checks | grep images: | sed -e 's/^ .*images: //' | sort | uniq >> linkerd_images.txt
我确实意识到,由于它们使用 linkerd 的二进制文件,因此它们对于应用程序来说可能是唯一的。如果是这样的话,那么我必须弄清楚在哪里可以找到文档,因为我在他们的存储库上找不到它(这就是为什么我首先来到这里)
编辑:这是我在脚本中遇到的错误:
UnicodeDecodeError: 'utf-8' codec: can't decode byte 0xe2 in position 49: Invalid continuation byte
如果我在终端中单独运行第一个命令,我会得到:
sed: -e expression #1, char 1: unknown command: '[Question Mark Symbol]'
我不太担心错误本身,因为我并不真正期待我的 python 代码得到直接答案。我只是想了解命令本身对所有奇特字符的作用。
我被要求添加 python 代码。我用过asyncio
的运行函数运行大多数 shell 命令。所以Python代码本身很简单:
asyncio.run(run(
"""./linkerd install --ha --ignore-cluster | grep image: | grep linkerd | sed -e 's/^ .*images: //' | sort | uniq >> linkerd_images.txt"""))
我还检查了 linkerd 二进制文件,它看起来确实像一个 json 文件。
答案1
这是我找到的答案
问题不在于插入符号,而在于撇号。给我命令的人是用法语键盘输入的。由于它在我的工作电脑上,因此我通过查看另一个屏幕在此处输入了它,因此我不假思索地重新输入了正确的撇号。现在我已经研究了 sed 的错误及其含义,它变得更有意义了。sed -e expression #1
是之后的第一个单词-e
(在本例中为's/^
)。'
如果我事先知道的话,Char #1 就是我最初应该查看的地方。