热门标签:
Q:

对于`子进程中的循环。run'results in'语法错误:"do"unexpected`

我试图通过python在shell中运行 for 循环。 操作系统。popen运行正常,但在3上不推荐使用。x和我要stderr。 以下是关于 如何在子进程中使用for循环的最高投票答案。运行命令 导致 语法错误:"do"unexpected ,shellcheck与此一致:

import subprocess
proc = subprocess.run(
    "bash for i in {1..3}; do echo ${i}; done",
    shell=True,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE, )

print(proc.stderr)

我最终试图通过调用此shell代码 重置所有usb https://unix.stackexchange.com/a/611305/362437 通过python,所以任何替代方法来做到这一点也将不胜感激。

原网址
A:

当你这样做的时候

subprocess.run('foo', shell=True)

它实际上运行相当于

/bin/sh -c 'foo'

(除了它神奇地得到所有的报价正确:-))。 所以,在你的情况下,它执行

/bin/sh -c "bash for i in {1..3}; do echo ${i}; done"

所以用-c开关给出的"命令"实际上是三个命令的列表bash for i in {1..3}do echo ${i}done。 这会给你留下一个非常困惑的外壳。

解决这个问题的最简单方法可能是从字符串的开头删除bash。 这样,传递给/bin/sh的命令就有意义了。

如果你想显式运行bash,你可能最好使用shell=False并使用列表作为第一个参数来保持你的引用理智。 类似

import subprocess
proc = subprocess.run(
    ['/bin/bash', '-c', 'for i in {1..3}; do echo ${i}; done'],
    shell=False,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE, )

相似问题