Linux下从Python调用Bash时大括号扩展失效原因探究
跨平台差异原因解析
这种差异的核心是subprocess调用时默认使用的Shell类型不同,具体细节:
- macOS系统中,
/bin/sh是bash的符号链接(即便系统默认用户shell改为zsh,/bin/sh依然指向bash)。当subprocess启用shell=True时,实际调用的是bash,而bash原生支持大括号扩展语法,因此脚本能正常输出1到10。 - 多数主流Linux发行版(如Ubuntu、Debian系列)中,
/bin/sh指向轻量POSIX兼容Shell——dash,dash不支持大括号扩展这类bash专属语法。subprocess默认调用/bin/sh执行脚本时,大括号会被当作普通字符串直接输出。
注:终端交互Shell下能正常执行,是因为你打开的交互Shell通常是bash(或其他支持扩展的Shell),而非系统默认的/bin/sh。
解决办法
要让Linux下也正常解析大括号扩展,只需明确指定用bash执行:
- 方式一:在subprocess调用中直接指定bash命令
import subprocess result = subprocess.run(['bash', '-c', 'for i in {1..10}; do echo $i; done'], capture_output=True) print(result.stdout) - 方式二:给脚本添加bash的shebang头,再调用脚本文件
脚本文件loop.sh内容:
Python调用代码:#!/bin/bash for i in {1..10}; do echo $i doneimport subprocess result = subprocess.run(['./loop.sh'], capture_output=True)
内容的提问来源于stack exchange,提问作者ginjaemocoes
相关产品推荐
相关产品推荐

