簡體   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