1

我正在尝试编写一个脚本来一次安装一些软件包。问题是,我使用的是 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 并等待。当我退出时,它会进入下一个安装分发的命令。如何让它easy_install在 sage shell 中运行命令?

4

2 回答 2

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/kshor#!/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, 或寻找其他对这种情况有意义的命令行选项。它可能是(我认为这是一个错误),sage 不会从 std-in 读取(这是 ahere-document正在使用的)。sage查看是否可以从 std-in 读取的最基本测试是echo exit | sage -sh.

IHTH。

于 2013-06-30T13:34:09.863 回答
0

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

于 2013-06-30T00:36:31.760 回答