KSH shell脚本不会执行并返回127(未找到)

时间:2010-04-14 13:57:53

标签: ksh execution return-code

任何人都可以告诉我为什么以下不起作用?

$ 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 个答案:

答案 0 :(得分:4)

可能有两个问题:

  • Shebang线是错误的(正如鬼魂所暗示的那样)

  • 脚本是从Windows保存的,并且有DOS行结尾。

对于后者,请

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

该命令应该产生不以^M结尾的shebang行。如果它以^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

答案 1 :(得分:1)

只是一个猜测,在padaddwip.ksh检查你的shebang。它应该是#!/bin/ksh之类的东西。如果没有,请使用which ksh查看ksh的安装位置。或者,您可以通过调用解释器(ksh)来执行脚本,例如

$ /bin/ksh padaddwip.ksh

另一种方法是将你的shebang改为#!/usr/bin/env ksh

此外,请确保执行脚本的用户的主要组为btgroup

答案 2 :(得分:1)

另一种摆脱令人讨厌的^M字符的脚本的方法是在vi中打开文件并输入:%s/^M//g(在vi中sed),其中^M这里是通过键入来创建的Ctrl-V然后Ctrl-M。我个人喜欢这种方法,因为你不需要创建一个备份文件,你可以立即看到结果 - 只是我的OCD习惯 -

此外,我在使用tr和控制字符(如\r时遇到了一些奇怪的问题,它可能是一个shell或特定于站点的问题,但在这种情况下,我需要使用上面的方法或从命令行sed ...非常类似DVK上面显示的;与sed -e 's/^M//g' padaddwip.ksh.bak > padaddwip.ksh一样,您可以通过^M然后Ctrl-V创建Ctrl-M(在vi编辑器模式下)。

答案 3 :(得分:0)

shebang很糟糕。

使用cmdline上的shell解释器测试场景。

ksh padaddwip.ksh