从shell中运行脚本

时间:2013-06-29 23:58:20

标签: python shell sage

我正在尝试编写一个脚本来同时安装一些软件包。问题是,我正在使用sage(http://www.sagemath.org),这就像是python的扩展。当我在终端时,我所做的就是键入:

/Applications/sage/sage -sh #to get into sage shell
easy_install -U distribute #to install package
exit #to get out of sage shell

但是,当我将这些命令写入shell脚本时,它会打开sage shell并等待。当我退出时,它会转到下一个安装分发的命令。如何让它在sage shell中运行easy_install命令?

2 个答案:

答案 0 :(得分:3)

假设sage的手册页或其他文档没有专门解决这个问题,并且你正在使用unix / linux / cygwin(ish)shell,你可能会发现here- documents将从中提供cmds sage的脚本。尝试

#!/bin/bash

 #to get into sage shell
/Applications/sage/sage -sh <<EOS
    easy_install -U distribute #to install package
    exit #to get out of sage shell
EOS

您还可以使用#!/bin/ksh#!/bin/sh和其他人作为'she-bang'行,它始终是shell脚本的第一行。您需要使用

使脚本文件可执行
 chmod 755 ./mySageTalkerScript.sh

要么在PATH变量中包含脚本的路径,要么提供相对路径(如chmod cmd所示)或完整路径,即

/path/to/script/mySageTalkerScript.sh

正如您所指出的那样,代码还有更多,如果您通过缩进代码来遵循良好实践,并且使用制表符进行缩进,则可以使用

缩进整个块。
 #to get into sage shell
    /Applications/sage/sage -sh <<-EOS
        easy_install -U distribute #to install package
        exit #to get out of sage shell
     EOS

请注意,现在<<-EOS之间添加了“ - ”字符。如果您不使用-EOS,则必须确保结束EOS位于左边距。在任何一种情况下,您都需要确保EOS是唯一可行的。最后,EOS可以是任何字符串,有些人使用!,但我发现使用像EndOfScript,EndOfData(EOS,EOD)这样的缩写来减少混淆。

如果sage未对此做出响应,请尝试删除-sh,或查找对此上下文有意义的其他cmd-line选项。它可能是(我会认为这是一个错误),sage不会从std-in读取(这是here-document正在使用的)。查看sage是否可以从std-in读取的最基本测试是echo exit | sage -sh

IHTH。

答案 1 :(得分:0)

sage shell是一个在前台运行的进程,由于脚本的顺序特性,sage shell必须在执行脚本的下一行之前完成运行。在sage shell退出之后,运行easy_install行。脚本按照书面形式执行。