传递给os.system的命令的shell语法错误

时间:2017-07-21 19:11:49

标签: python shell

我的Python程序中出现了一些奇怪的行为。

perf_join_cmd = "join <(sort -k1,1 {}) <(sort -k1,1 {}) > {}.ScoreProfile"
perf_join_cmd = perf_join_cmd.format(meta, extracted_snps, out)
os.system(perf_join_cmd)

我正在创建一个字符串,将参数传递给字符串。该字符串表示要在shell上运行的join / sort管道命令,因此我调用了os.system。

错误是:

sh: -c: line 0: syntax error near unexpected token `('
sh: -c: line 0: `join <(sort -k1,1 ../../ADHD_GWAS.tbl) <(sort -k1,1 ../adhd-c/bin/adhd-merged.subset) > adhd-c.ScoreProfile'

我已经对此进行了足够长时间的攻击并且我没有看到任何看起来像语法错误的东西 - 所以我怀疑这里发生了更深层次的事情,我希望有人可以解释一下。

作为一个FYI,这是打印时perf_jon_cmd的输出:

join <(sort -k1,1 ../../ADHD_GWAS.tbl) <(sort -k1,1 ../adhd-c/bin/adhd-merged.subset) > adhd-c.ScoreProfile

任何帮助表示赞赏!

感谢。

2 个答案:

答案 0 :(得分:1)

sh: -c: line 0: syntax error near unexpected token `('

开头的sh:表示该命令是由/bin/sh执行的, 并且不是 Bash。 <(...)中不支持/bin/sh语法。

您可以尝试运行Bash,只需注意引用:

perf_join_cmd = "join <(sort -k1,1 {}) <(sort -k1,1 {}) > {}.ScoreProfile"
perf_join_cmd = perf_join_cmd.format(meta, extracted_snps, out)
os.system("bash -c '{}'".format(perf_join_cmd))

请注意,如果perf_join_cmd包含任何单引号,则上述操作无效。 如果这是一个问题,你可以尝试用双引号括起来。 (如果perf_join_cmd不包含双引号...)

运行像这样的复杂shell命令非常脆弱。 在简单的shell环境中工作时,用户经常对引用和shell扩展规则感到困惑。 当通过另一种语言这样做时, 它变得更加混乱和容易出错。

一个好的中间地带可能是将复杂的命令封装到一个脚本中,这样你就可以简单地运行:

os.system("script.sh args ...")

此处不需要bash -c '...'包装, script.sh应该有一个正确的#!/bin/bash shebang line, 并且它将按预期运行。

答案 1 :(得分:-1)

perf_join_cmd = "join <(sort -k1,1 {}) <(sort -k1,1 {}) > {}.ScoreProfile"

您可能只需要关闭第一个<

perf_join_cmd = "join <(sort -k1,1 {})> <(sort -k1,1 {}) > {}.ScoreProfile"