Это не то, что вы думаете:
>>> subprocess.run(['false', '|', 'true'], shell=True)
Когда вы передаете список строк в subprocess.run
и указываете shell=True
, только первый элемент интерпретируется как команда (оставшиеся элементы предоставляются в качестве аргументов оболочки). Сравните вывод:
>>> subprocess.run('echo hello world', shell=True)
hello world
CompletedProcess(args='echo hello world', returncode=0)
С:
>>> subprocess.run(['echo', 'hello', 'world'], shell=True)
CompletedProcess(args=['echo', 'hello', 'world'], returncode=0)
С:
>>> subprocess.run(['echo $0 $1', 'hello', 'world'], shell=True)
hello world
CompletedProcess(args=['echo $0 $1', 'hello', 'world'], returncode=0)
Итак, то, что у вас есть, эквивалентно:
>>> subprocess.run('false', shell=True)
А знаете ли вы, почему коды возврата subprocess.run ('false | true', shell = True) и subprocess.run (['false', '|', 'true']) равны разные?
Потому что первый запускает false | true
, который является конвейером. Код выхода конвейера - это код выхода последней команды в конвейере (в данном случае true
). Второй вызов, как обсуждалось здесь, просто запускает false
.