【问题标题】:Assign a bash command result in a Cheetah variable在 Cheetah 变量中分配 bash 命令结果
【发布时间】:2017-10-25 15:15:43
【问题描述】:

我目前正在尝试将 bash 命令的结果放入 Cheetah 变量中:

#set $name = #echo '$input.element_identifier' + ".phy" | cut -d _ -f 1

'$input.element_identifier' 是(某种意义上)指向前一个输入文件名称的链接(我尝试在生物信息学软件 Galaxy 的 xml 包装器部分中做到这一点)

我的问题是 Cheetah 无法识别 echo 命令中的“$”...我尝试了很多其他语法但问题仍然存在(所以我不知道命令的其余部分是否是正确的)

这是一个相当具体的问题(与 Galaxy 软件的管理和使用有关),我希望我很清楚。

谢谢

【问题讨论】:

    标签: bash cheetah


    【解决方案1】:

    您当前方法的两个错误:

    1. #echo 不执行操作系统命令,#echo 执行 Python 表达式。

    2. #echo 不返回结果,#echo 将结果放入输出流(HTML 或任何输出)。

    要执行操作系统命令,您需要os.system()subprocess.Popen()。要分配命令的结果,您当然需要捕获命令的标准输出,Popen 更适合该任务。

    类似的东西:

    #import subprocess
    #set $name = $subprocess.check_output($input.element_identifier + '.phy | cut -d _ -f 1', shell=True)
    

    【讨论】:

    • shell=True,而不是use_shell=True。也就是说,这对我来说根本看起来并不安全(就避免 shell 注入攻击而言)——在由 shell 解析为代码的位置注入任意字符串是安全妥协的简单途径。如果可以运行 Python 代码,为什么不在 Python 中做提取我们想要的文件名组件的工作呢?
    • ...如果您确实想在仍然使用shell=True 的同时确保其安全,您可以将替换从代码本身带外移出—— subprocess.Popen(['shell script here using "$1"', '_', "this becomes $1"], shell=True) 是如何安全执行此操作的示例(如果 shell 脚本在您作为作者的控制之下,但替换 this becomes $1 的值不是)。
    • @CharlesDuffy 感谢shell=True!我总是忘记subprocess 的参数。
    • 好吧,我尝试了一些东西(又有点随机),这个命令似乎工作了(那时我没有错误了):#set $name = $subprocess.check_output(["echo", $input.element_identifier'.phy', "|", "cut", "-d", "_", "-f", "1"] )。另一个命令#subprocess.call(["mv", $input.element_identifier'.phy', $new_file]) 也无法识别“$”...
    • 拥有 Python 时为什么要使用 shell?使用os.rename()
    猜你喜欢
    • 2011-01-23
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 2014-02-04
    • 2021-03-06
    • 2022-10-19
    • 2020-05-16
    相关资源
    最近更新 更多