繁体   English   中英

从shell中运行脚本

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM