2010-04-14 42 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