2014-09-03 130 views
1

裏面我有以下內容在Mac(OSX 10.9)命名msii810161816_TMP_CMD一個shell腳本。「命令未找到」 shell腳本

matlab 

當我執行它,我得到

./msii810161816_TMP_CMD: line 1: matlab: command not found 

然而,當我鍵入matlab入殼內直接啓動正常。這怎麼可能是相同的命令在shell中工作,而不是在shell腳本中?我直接從腳本到外殼複製粘貼命令和它的工作...

PS:當我與

echo matlab 

更換腳本的內容,我得到了想要的結果,這樣我就可以絕對執行shell腳本(我用./msii810161816_TMP_CMD)

謝謝你們!

+0

shell腳本是可執行文件(我與回聲MATLAB執行它)。什麼是shebang線?我的文件的唯一內容是「matlab」 – megavore 2014-09-03 08:43:34

+0

如果使用shebang行,你的意思是在腳本的開頭添加#!/ bin/sh,我只是做了它,但沒有任何區別。 – megavore 2014-09-03 08:54:02

+0

嘗試用/ full/path/to/matlab替換matlab – 2014-09-03 08:55:31

回答

-1

這是因爲,正如評論者所述,執行腳本的shell內部的PATH變量不包含包含matlab可執行文件的目錄。

當使用命令名稱時,如「matlab」,你的shell依次查找PATH中的每個目錄,搜索一個包含名爲「matlab」的可執行文件的目錄。


沒有進入太多細節,PATH是由被調用的shell決定的。 當您執行bash,它結合了基本目錄,必須在PATH與任何設置在你~/.bashrc能改變PATH全局設置。

很可能,您沒有在PATH包含matlab的目錄的shell中運行腳本。 要驗證這一點,您可以採取以下步驟:

  • 運行which matlab。這將向您顯示matlab可執行文件的路徑。
  • 運行echo "$PATH"。這會向您顯示您當前的PATH設置。請注意,which matlab的目錄包含在以冒號分隔的列表中。
  • 添加一行到你的腳本,並echo "$PATH"的開始。請注意,不包括which matlab的目錄。

要解決此問題,請確保您的腳本在具有PATH中所需目錄的shell中執行。 你可以做到這一點的幾種方法,但兩個最高度推薦的人將

  1. 一個認領行添加到您的腳本的開始。假設你想用bash來運行它,可以使用#!/bin/bash或者任何你的bash解釋器的路徑。 shebang行實際上並沒有被POSIX完全標準化,所以BSD衍生的系統(如OSX)會高興地處理shebanged可執行文件的多個參數,而Linux系統最多隻能傳遞一個參數。 儘管如此,shebang是一個簡單易行的方法來記錄應該用來執行腳本的內容,所以這是一個很好的解決方案。

  2. 明確將其作爲外殼的解釋調用腳本,如bash myscript.shtcsh myscript.sh甚至sh myscript.sh 這不是用認領線,並同時使用是一種常見的做法是不相容的。 我相信OSX上的默認shell始終是bash,所以你應該先嚐試一下。


如果這些指令不幫助,那麼你就必須深度挖掘,以找出原因或PATH是如何被改變的調用上下文和腳本的內部上下文之間。最終,這幾乎肯定是你問題的根源。

0

默認情況下,別名不會在非交互式shell中展開,這是shell腳本的作用。一個人在鍵盤上使用別名作爲打字輔助。

如果您的目標是不必鍵入matlab的完整路徑,而不是創建別名,則應修改$PATH。添加/Applications/MATLAB_R2014a.app/bin$PATH environment variable,然後你和你的shell腳本就可以簡單地說

matlab