使用sh和./運行bash腳本有什麼區別

當使用任何類型的腳本,而不僅僅是bash腳本時,也會出現同樣的問題。 通過解釋器運行腳本和直接運行腳本之間有主要區別嗎?

我們將在“讓我們使用Linux(uL)”這一有趣的文章中揭示另一個神秘之處。


通過將腳本的文件名傳遞給解釋器(sh,python,perl等)來運行腳本時,實際上是在執行解釋器,並將要執行的程序作為參數傳遞。 例如,我們通過向其傳遞miscript.sh參數來運行sh解釋器。

sh myscript.sh

如果您單獨運行腳本,則係統將調用所需的解釋器,然後,是的,它將執行腳本,將其作為參數傳遞給解釋器,但會自動執行,並且不會使執行腳本的用戶知道。

./myscript.sh

為了單獨運行腳本,必須滿足兩個條件:

1)腳本必須包含“爆炸行”。 這是腳本的第一行,必須以字符#!開頭。 並且您必須指定解釋器所在的路徑。 重要的是要注意,此條件對於任何類型的腳本(python,perl等)都是正確的,而不僅僅是bash中的腳本。

因此,例如,我們的腳本應包含以下內容作為第一行:

#!/斌/慶典

2)文件必須具有執行權限:

要向我們的腳本授予執行權限,我們必須編寫:

chmod a + x miscript.sh

準備好了,現在像這樣運行它:

./myscript.sh

或者通過將腳本複製到“特殊”路徑以使其易於調用。 例如,我們可以將其複製到/ usr / sbin並從任何地方運行,而無需包括其所在的完整路徑:

我們複製:

須藤cp miscript.sh / usr / sbin / miscript

我們執行:

腳本

如您所見,實際上,在兩種情況下,幕後發生的事情都非常相似。 但是,通過添加“爆炸行”,您的腳本將更易於分發,因為用戶不必記住執行這些腳本所需的解釋器的路徑。 結論:這基本上是一個舒適的問題。


發表您的評論

您的電子郵件地址將不會被發表。 必填字段標有 *

*

*

  1. 負責數據:MiguelÁngelGatón
  2. 數據用途:控制垃圾郵件,註釋管理。
  3. 合法性:您的同意
  4. 數據通訊:除非有法律義務,否則不會將數據傳達給第三方。
  5. 數據存儲:Occentus Networks(EU)託管的數據庫
  6. 權利:您可以隨時限制,恢復和刪除您的信息。

  1.   奧斯瓦爾多·比利亞羅爾(Oswaldo Villarroel) 他說:

    我同意您的意見,解釋器的版本及其路徑都是可變的而不是恆定的,甚至更多,如果考慮到GNU / Linux發行版並不是唯一使用Bash的發行版(還有:freeBSD,OpenSolaris ,Mac),其中許多具有不同的配置或路由。

    重要的是要知道,您可以靈活地(如您所述)使用./或sh(或python ...等)來調用腳本。

  2.   he_who_knows@gmail.com 他說:

    Bash是一種計算機程序,其功能是解釋訂單。

    它基於Unix Shell,並且符合POSIX。

    sh是一個計算機程序,其功能是解釋訂單。
    結合了過程控制,重定向等功能
    輸入/輸出,文件列表和讀取,保護,
    通信和用於編寫程序的命令語言
    批處理或腳本。 它是Unix的第一個版本中使用的解釋器,它已成為事實上的標準。

  3.   戴安娜C 他說:

    您好,我是腳本使用的初學者,我想知道是否有人可以幫助我解決以下問題:

    我正在管理一個需要通過控制台包含多個初始數據的程序,我發現通過腳本可以用初始數據執行該程序,從而不必在我一次又一次地編寫它需要運行程序。

    我不知道該怎麼做,所以如果有人可以幫助我,我將非常感激。

  4.   讓我們使用Linux 他說:

    看,這取決於您使用哪種編程語言編寫腳本。 但是,無論如何,您需要:

    1)如果您希望用戶每次執行腳本時都必須輸入該數據,則最常見的過程是使變量採用輸入中輸入的值。

    2)如果值始終相同,則可以使用常量。

    3)另一個選擇是您的腳本可以接受參數的可能性。

    乾杯! 保羅

  5.   讓我們使用Linux 他說:

    您提到的很有趣。 它被稱為2種形式:shebang線或直接bang線。 我給你的信息: http://python.about.com/od/programmingglossary/g/defbangline.htm
    乾杯! 保羅

  6.   @llomellamomario 他說:

    有趣的是,我一直沒有停止思考這個細節。 看到更多關於控制台修整的文章會很有趣,其中包括著名的內核重新編譯,以刪除不必要的數千代碼,這些代碼僅是為了兼容性和提高系統速度。

  7.   讓我們使用Linux 他說:

    好的。 我會記住這一點。
    乾杯! 保羅

  8.   讓我們使用Linux 他說:

    我很高興它奏效。 我總是嘗試發布一些我認為可能有趣且實用的內容。
    一個擁抱! 保羅

  9.   菲利克斯·曼努埃爾·布里托·阿馬蘭特 他說:

    每個有良好習慣的程序員都會在第一行代碼中添加一個“爆炸行”。 在Python中,我永遠不會忘記編碼和爆炸線。
    #!/ usr / bin / python2.7
    #*。*編碼= utf-8 *。*

  10.   迪克斯02 他說:

    太好了,我希望您可以發布有關命令行的更多信息,尤其是從源文件(tar.gz等)進行編譯或安裝時。

  11.   喬·迪卡斯特羅 他說:

    我從未聽說過“爆炸線”,我一直將其稱為“射棒”

    http://en.wikipedia.org/wiki/Shebang_%28Unix%29

    問候

  12.   喬納森費爾南德斯 他說:

    有趣的筆記……謝謝!

  13.   電子郵件 他說:

    多麼有趣,我宣布自己對編程以及與腳本相關的一切一無所知,我不知道它是如何工作的,但是我注意到有些人擁有該標頭。

  14.   馬里奧·雷蒙迪 他說:

    我發生的與此帖子有關的澄清:我想安裝一個Adobe Air Gadget(撲克賠率計算器)。 adobe air安裝程序的工作是使用“ su”運行相應的腳本,但格式為./,要求您輸入root密碼。 由於腳本沒有執行權限,因此它拒絕了權限,因此解決方案:如果您不想更改權限,則使用sh運行腳本(比轉到tmp chmod文件夾以及所有操作更快)。 腳本在那裡執行,它調用adobe安裝程序和另一個蝴蝶程序。

  15.   埃羅·森寧 他說:

    非常有趣的文章! 感謝您幫助我了解有關控制台的更多信息。 讓我們看看您是否繼續發布此類^^的文章。
    繼續努力,這無疑是我最喜歡的博客!

  16.   功率 他說:

    應該注意的是,所使用的解釋器的版本之間可能會有差異。 根據shebang直接運行腳本,無法指示要使用哪個版本的解釋器。 如果您改為運行解釋器並將腳本作為參數傳遞,則可以知道它正在運行哪個版本。

    例如,在Python中,如果shebang是#!/ Usr / bin / python2.4,則程序的執行方式將與如果是#!/ Usr / bin / python2.6或如果是#!/ Usr / bin / python / Python的執行方式不同。 (通常是默認情況下安裝和配置的Python版本的符號鏈接)。 發生這種情況是因為Python 2.6具有Python 2.4中不存在的新功能,因此如果系統僅安裝了python 2.4,則編寫使用該功能的腳本會指示#!/ Usr / bin / python shebang將會失敗。 相反,您始終可以通過以“ python2.4 /path/al/script.py”或“ python2.6 /path/al/script.py /”開頭來強制腳本以所需的python版本運行。

    對於shell腳本,您使用的shell之間也存在差異,因此根據腳本的不同,使用#!/ bin / sh和#!/ bin / bash可能會有不同的結果。 如果您使用僅在bash中存在的功能來編寫腳本,但指示出shebang#!/ Bin / sh,則您的腳本可能會在Linux上運行(在大多數發行版中/ bin / sh是bash的符號鏈接),但可能會失敗在其他未安裝bash或/ bin / sh不是/ bin / bash的符號鏈接的UNIX中。

    同樣與可移植性有關,必須考慮到shebang中指示的路徑是絕對路徑,並且有時解釋器會安裝在其他位置。 例如,如果您已經下載並編譯了Python,而不是使用發行版中的軟件包,則通常在/ usr / local / bin / python中安裝python解釋器。 如果您的Shebang是#!/ Usr / bin / python,則該腳本將無法在這些系統上運行。 為了避免這些問題,您可以按照以下說明使用shebang“#!/ Usr / bin / env python”(或“#!/ Usr / bin / env sh”)作為shebang。 http://en.wikipedia.org/wiki/Shebang_(Unix)#Portability

  17.   讓我們使用Linux 他說:

    謝謝喬納森! 很高興看到您發表評論!
    乾杯! 保羅

  18.   安東尼奧 他說:

    我想知道的東西無處不在,或者至少我不知道如何將其放入搜索引擎,我想創建一個腳本,由於xX執行命令aptitude或«su»的原因(這只是一個示例)但是有兩種情況我可以考慮),如果有才能,有時會要求我輸入“ yon”,或者在“ su”中會要求我輸入密碼...我希望腳本選擇那些通過傳遞參數或使用不知道的方法自動選擇...。 感謝您的關注

    1.    讓我們使用linux 他說:

      你好安東尼奧! 如果您的問題是必須輸入密碼,我認為沒有解決方案。 正是因為這是一種安全措施,所以並不是每個人都可以安裝程序。
      關於能力和必須接受,我認為可以解決。 我現在不記得要使用的確切參數,而只是在手冊頁中找到。 打開終端並輸入命令:man aptitude。
      擁抱! 保羅

  19.   戴維·MM 他說:

    很好的帖子。
    我特別喜歡-在這篇文章中-所產生的問題/疑問可以非常清晰,簡潔地回答。