[英]Running a script from within a shell
我正在尝试编写一个脚本来同时安装一些软件包。 问题是,我正在使用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
命令?
假设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
echo exit | sage -sh
。
IHTH。
sage shell是一个在前台运行的进程,由于脚本的顺序性,sage shell必须在执行脚本的下一行之前完成运行。 在sage shell退出之后,运行easy_install行。 脚本按照书面执行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.