2010-10-05 72 views
11

我正在學習如何在UNIX中創建shell腳本,但我一直在遇到這個愚蠢的錯誤。假設我編寫這樣的腳本:嘗試運行UNIX腳本後未找到命令錯誤消息

#!/bin/sh 
echo HELLO 

我將文件保存爲test,並使用chmod 700 test命令執行該命令。我保存在我的主目錄下的文件,(未遂)運行,像這樣的文件:

./test 

僅用於UNIX回覆:

./test: Command not found. 

這是怎麼回事?當我輸入ls -l時,文件名旁邊有一個星號。在我使用chmod命令之前,這並不存在。誰能告訴我我做錯了什麼?

+2

是否'LS /斌/ sh'顯示具有可執行位文件啓用? – Ether 2010-10-05 19:58:18

+0

當你添加缺少的斜槓時,你是否仍然遇到問題?你用什麼(非常)奇特的選項裝載目錄? – 2010-10-05 22:36:03

回答

5

它看起來像你所需要的倉前斜線:

#!/bin/sh 
#^

其他一切看起來罰款...我假設/bin/sh是可執行Bournse殼的位置 - 如果不是,您需要適當調整。沒有前導斜槓,您的外殼正在尋找bin/sh相對於您當前的目錄,而不是它真正駐留的位置。

您需要找到您想要(或需要)腳本的可執行shell解釋器。

一對夫婦多提建議 - 我的機器上我得到這些結果:

# tells you where sh resides, if it is on your path 
$ which sh 
/bin/sh 

# tells you which shell you are currently using 
$ echo $SHELL 
/bin/tcsh 

我可以使用這些爲「shebang」線的一個簡單的shell腳本。例如,您可能會發現您的Bourne shell位於/usr/bin而不是/bin

+0

好吧,我只是用你發佈的內容替換了標題,而且我得到了同樣的錯誤。 – Waffles 2010-10-05 19:32:42

0

#!告訴Unix使用指定的程序執行腳本。在你的情況下,你已經指定bin/sh,但它應該是/bin/sh。 Unix給出的錯誤信息對於找不到哪個程序不是特別清楚。

11

使其可執行:

chmod +x ./test 

,並確保你保存的Unix文件格式的文件。並且:檢查你的分區是否可執行(mount)。

0

要添加到Martin的答案,您說您將文件保存在您的主目錄並運行它作爲./test。只有當前工作目錄與主目錄相同時,這纔會起作用。

文件名旁邊的星號表示該文件是可執行文件。

+0

那麼,我目前在我的主目錄。 – Waffles 2010-10-05 19:38:10

+1

@Waffles:如果Martin的回答沒有幫助,並且您位於文件所在的同一目錄中,您確定您有'/ bin/sh'程序嗎?它可能是'/ bin/zsh'或'/ bin/bash',具體取決於你正在運行的類UNIX系統。 – 2010-10-05 19:57:31

+1

任何可以合理稱爲unix的東西都有一個Bourne或POSIX shell作爲'/ bin/sh',即使首選shell是'/ bin/bash'或'/ bin/ksh'之類的東西。 – Gilles 2010-10-05 23:56:04

2

./test是一個可執行腳本,但正在執行它給出錯誤消息./test: Command not found時,請檢查解釋器是否存在。您必須提供絕對路徑(不使用PATH環境變量)。

如果文件已經通過Windows機器,請確保行尾沒有寄生回車符,因爲CR將是解釋器文件名的一部分。您可以使用<test head -n 1 | od -t x1進行檢查:如果以0d 0a結尾,則存在CR,您需要將其刪除(您可能還需要從其他行刪除CR)。

8

這確實很奇怪。您描述的步驟應該已經奏效,因此您的環境中必須存在一些小錯誤或執行這些步驟。有一些事情可以做,以幫助診斷此:

檢查控制字符

什麼你記錄看起來不錯,只要沒有錯別字或控制字符。您應該通過鍵入以下內容進行檢查:

cat -vt ./test 

如果您看到任何可以解釋問題的意外額外文本。例如,行尾的「^ M」表示您的編輯器以Windows格式保存了該文件。

再生文件可靠

要創建已知良好的./test2,複製粘貼下面的命令:

`which bash` 
printf "#\!`which sh`\necho HELLO\n" > ./test2 
chmod +x ./test2 
./test2 
exit 

正在檢查這在您鍵入命令不能找到

.. 。

./ajio 

...你確切地得到...

./ajio: Command not found. 

......正如你所說的與./test?我只是把名字叫做ajio,所以它不應該存在。如果他們的消息匹配,那麼它並沒有真正告訴你任何新東西。但是如果消息不同,那確認./test至少被發現並且可執行。

也有可能您的sh版本試圖告訴您沒有test找不到,但是在運行test的某些命令時找不到該shell試圖運行的命令。這不應該是echo命令,就像在shell中實現的大多數shell實現一樣,這將是一個內部命令。但是,shell可能會運行一個初始化腳本,其中包含一行指定它無法運行的命令。如果您運行的是man sh,它會告訴您有關shell可能會嘗試運行的所有不同的啓動文件。這些可以與交互式啓動shell時使用的不同。但作爲初學者,檢查這些腳本的有效性可能令人望而生畏。很可能任何虛假的定製都會影響到你的個人shell啓動過程,而不會影響整個Linux的安裝,因此運行ls -ld ~/.*來列出你的主目錄中的隱藏文件,並檢查看起來像shell啓動文件的任何東西(例如〜/ .bashrc,〜/ .profile,〜/ .bash_login)。檢查它們指定的任何命令可以與哪些命令一起找到,並在路徑變量設置爲包含它們的位置後調用。

相較於另一個shell

如果有問題與/ bin/sh的安裝/初始化,那麼你也許可以通過調用另一個shell繞過它。嘗試...

which zsh 
which tcsh 
which csh 

...如果更多的這些人們發現一種替代殼給你,編輯或創建該文件指定外殼,阿拉...

#!/bin/csh 
echo HELLO 

...然後chmod +x它和./ - 運行它。如果可行,那麼你知道你的問題是/ bin/sh特定的。

+1

我正在將'cat -vt'提交給永久內存,這很有用! – ken 2014-06-08 06:00:06

+0

偉大的提示。我查看了手冊頁,我認爲它可以縮寫爲'cat -t',這與'cat -vT'相同。 – Josh 2016-08-06 06:44:59

+0

使用'cat -vt'來檢測我的腳本文件是否有不正確的Windows行結束符保存了一天。謝謝。 – 2017-12-18 23:11:54

1

我有同樣的問題,我把文件從Windows複製到Linux並試圖執行它。我做了以上所有建議,但沒有任何幫助,直到我在文件上做了一個dos2unix並修復它。它可能不是你的情況,但只是把它放在那裏

+0

這實際上有效! – Cheshar 2016-04-19 08:35:23

1

我有一箇舊的SCO OpenServer 5.0.7虛擬機類似的問題。開車送我,我不能運行與

開始

「#!/斌/慶典」

(減去引號,當然)在這裏讀線程某些腳本堅果,我恍然大悟,檢查是否/ bin/bash甚至存在。結果發現它不見了。我從SKUNKWARE2000光盤安裝,一切正常。

3

首先,檢查/ bin/sh是否存在,如果不存在,那麼這就是你的問題。

如果你安裝了/ bin/sh,那麼我認爲如果你的路徑配置不當,會發生這種情況。 在這種情況下,您可以從test.sh所在的當前工作目錄中嘗試:/bin/sh test.sh

如果您從Windows複製文件,也請嘗試dos2unix test.sh

相關問題