[英]Korn Shell Scripting header error
我剛找到一份工作,其中80%的工作都在Unix環境中。 我正在學習如何shell腳本。 我真的很難嘗試在我的練習腳本上設置標題。 如果您看一下我的第一個腳本,它將接受標頭。 我在新腳本上再次創建了相同的標頭,這給我帶來了錯誤的解釋器。 兩者都是使用命令chmod u+x nameOfScript
創建的可執行文件。 這兩個腳本位於同一位置。 所以我真的不明白發生了什么。 看一看:
parallels@ubuntu:~$ cat firstApp.ksh
#!usr/bin/ksh
# this prints the first line.
echo "Hi this is my first app, which me luck!"
echo "i hope this works again"
#this is a comment as well
現在看看我的其他腳本不起作用,相同的標題
parallels@ubuntu:~$ cat thirdApp.ksh
#!usr/bin/ksh
#print this
echo "I'm gonna try this again"
當我運行此腳本時,它將運行...
parallels@ubuntu:~$ ./firstApp.ksh
Hi this is my first app, which me luck!
i hope this works again
但是當我運行它失敗
parallels@ubuntu:~$ ./thirdApp.ksh
bash: ./thirdApp.ksh: usr/bin/ksh: bad interpreter: No such file or directory
我正在兩個腳本上完全復制標題,當我尋找Korn shell標題時,我得到了
parallels@ubuntu:~$ which ksh
/usr/bin/ksh
parallels@ubuntu:~$
請讓我了解我在做什么錯。 Unix對我來說仍然很新。
該命令僅在根目錄中運行時有效。 你需要:
#!/usr/bin/ksh
使用完整的絕對路徑名(以/
開頭),而不是使用以下相對路徑名:
#!usr/bin/ksh
請注意,相關性,shebang( #!
)必須是文件中的前兩個字符。 前導空白行或#
之前的行中的空白使其無關緊要; 內核看起來是否前兩個字符是#!
如果不是,則忽略shebang線。
在Unix中, #!
位於腳本第一行第一列的叫做shebang 。 這是允許Unix執行程序找出您要用來處理腳本的程序的機制。 如果沒有shebang ,您的腳本將使用您的默認shell執行。
如果您的shell腳本中沒有shebang,但是用戶的默認shell是Kornshell,一切都會好起來的。 如果用戶的默認外殼是C-shell,則您的腳本將無法運行。 因此,您應該始終使用shebang。
shebang的問題在於它不使用您的$PATH
查找程序。 相反,您必須具有硬編碼路徑。 如果你有:
#! usr/bin/ksh
而且,您位於/home/opj
目錄中,它將查找/home/opj/usr/bin/ksh
。 這是無法正常工作的腳本的問題。 您需要以/
開頭
#! /usr/bin/ksh
也就是說,當然,假設您的Kornshell應用程序在/usr/bin/ksh
,而不在/bin/ksh
。 大多數外殼程序位於/bin
目錄下。 檢查以確保它是/bin/ksh
或/usr/bin/ksh
。
解決此限制的一種方法是依賴env
,它幾乎總是在/usr/bin
。 使用env
, env
將沿着路徑搜索程序,然后將其用作腳本的解釋器:
#! /usr/bin/env perl
無論是在/bin/perl
, /usr/bin/perl
還是/usr/local/bin/perl
下,我的腳本都可以找到Perl解釋器。 實際上, Perlbrew嚴重依賴此行為。
缺點是您不能強迫某人使用您的解釋器的特定版本。 如果我有#! /bin/ksh
#! /bin/ksh
,這就是我的腳本將要使用的。
還有一件事。 為什么要使用Kornshell而不是BASH。 BASH和Kornshell在語法上有95%相同,但是BASH現在更加普及了。 我之所以使用Kornshell,是因為這是我在20世紀最后二十年學到的。 我什至在Mac上安裝了Kornshell就是因為我喜歡Bash中沒有的功能。
但是,我建議新用戶學習BASH只是因為他們遇到問題時,就會有更多的資源。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.