代码之家  ›  专栏  ›  技术社区  ›  Hatshepsut

子流程如何处理列表和shell=True

  •  1
  • Hatshepsut  · 技术社区  · 6 年前

    shell=False 以避免 shell=True . 有时我看到这样的代码,它返回True,但它似乎没有打印任何内容,我不知道发生了什么。

    subprocess.run(['echo', 'hi'], shell=True, check=True).returncode == 0
    

    相比之下,

    subprocess.run(['echo', 'hi'], shell=False, check=True).returncode == 0
    

    当我传递一个列表作为参数并且shell=True时会发生什么?

    1 回复  |  直到 6 年前
        1
  •  2
  •   that other guy    6 年前

    the documentation

    在shell=True的POSIX上,shell默认为/bin/sh。如果args是字符串,则该字符串指定要通过shell执行的命令。这意味着字符串的格式必须与在shell提示符下键入时的格式完全相同。例如,这包括引用或反斜杠转义文件名,其中包含空格。

    所以你的命令相当于 sh -c "echo" "hi" ,它只是执行 echo 没有争论。

    一个更有用的示例是使用此机制将任意数据安全地传递给shell片段:

    file1='my file.txt'
    file2='Author&Title - [FOO] **proper**.mp3'
    subprocess.run(
        ['for f; do printf "Input: %s\n" "$f"; done', '_',
          file1, file2],
        shell=True, check=True)
    

    '_' 变成 $0 ).