2010-04-14 41 views
2

任何人都可以啓發我爲什麼以下將無法正常工作?KSH shell腳本將不會執行並返回127(未找到)

$ groups 
    staff btgroup 
$ ls -l 
    total 64 
    -rw-rw---- 1 sld248 btgroup  26840 Apr 02 13:39 padaddwip.jks 
    -rwxrwx--- 1 sld248 btgroup  1324 Apr 02 13:39 padaddwip.ksh 
$ ./padaddwip.ksh 
    ksh: ./padaddwip.ksh: not found. 
$ echo $? 
    127 

這與另一個工作得很好的腳本幾乎相同。我無法看到兩者在權限或所有權方面的差異。

回答

4

可以存在2個問題:

  • Shebang線是錯誤的(因爲暗影鬼)

  • 該腳本是從Windows保存並具有DOS行結尾。

對於後者,做

head padaddwip.ksh | cat -vet | head -1 

該命令應產生的家當符合^M沒有不散。如果它以^M結束,這是一個DOS編碼的文件,以及解決方法是:

cp padaddwip.ksh padaddwip.ksh.bak 
dos2unix padaddwip.ksh.bak > padaddwip.ksh 
./padaddwip.ksh 

在沒有DOS2UNIX的系統,你可以使用

cat padaddwip.ksh.bak | tr -d "\r" > padaddwip.ksh 
+0

好的,謝謝DVK,我認爲你是對的。我的另一個腳本在每行的末尾沒有^ M,但不起作用的腳本在每行末尾都有^ M。不幸的是,dos2unix沒有安裝在我的AIX服務器上(並且我沒有root權限)。我會糾纏那些能力。有沒有辦法將文件FTP到AIX服務器,它將正確地去除/轉換? – 2010-04-14 14:26:56

+0

@Chris - 是的。在FTP中設置「ascii」模式 – DVK 2010-04-14 14:44:07

+0

@Chris - 同樣,在dos2unix的最後部分,只需運行'cat padaddwip.ksh.bak | tr -d「\ r」> padaddwip.ksh' – DVK 2010-04-14 14:48:50

1

只是一個猜測,檢查您的shebang在padaddwip.ksh。它應該是類似#!/bin/ksh。如果沒有,請使用which ksh來查看您的ksh的安裝位置。另外,您也可以通過調用解釋(KSH)如

$ /bin/ksh padaddwip.ksh

另一種方式,你可以做的就是改變你的家當來#!/usr/bin/env ksh

而且執行腳本,確保執行腳本的用戶有主組作爲btgroup

+0

第一行腳本顯示:#!/ bin/ksh 而'which ksh'顯示:/ usr/bin/ksh – 2010-04-14 14:06:07

+0

那麼你爲什麼不嘗試改變你的shebang到'/ usr/bin/ksh'的地方去看看。 – ghostdog74 2010-04-14 14:08:30

+0

感謝ghostdog74,我認爲你的建議會奏效。有趣的是,/ bin/ksh padaddwip.ksh的輸出是: $/bin/ksh padaddwip.ksh padaddwip.ksh [13]:^ M:找不到。 padaddwip.ksh [14]:^ M:找不到。 padaddwip.ksh [17]:^ M:找不到。 將所有輸出記錄到padaddwip.log .... 是否這些導致問題的^ M字符? – 2010-04-14 14:14:29

1

另一種方式來擺脫惱人的^M腳本字符將在vi中打開該文件並鍵入:%s/^M//g(在vi中的sed),其中通過鍵入Ctrl-V然後Ctrl-M創建^M。我個人很喜歡這種方法,因爲你並不需要創建一個備份文件,你可以立即看到結果 - 只是地雷的

也是一種強迫症的習慣,我曾與使用tr和控制字符,如一些奇怪的問題, \r它可能是一個殼或特定站點的問題,但在這種情況下,我需要使用上述任何一種方法或sed的命令行...非常類似上面什麼DVK顯示;像sed -e 's/^M//g' padaddwip.ksh.bak > padaddwip.ksh那裏你通過Ctrl-V然後Ctrl-M(在vi編輯器模式下)創建^M

+0

我會承認根本不知道VI,但是感謝有用的迴應。 – 2010-04-15 07:30:17

0

shebang是壞的。

用cmdline上的shell解釋器測試場景。

ksh padaddwip.ksh