我正在尝试编写一个脚本来同时安装一些软件包。问题是,我正在使用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
命令?
答案 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行。脚本按照书面形式执行。