【问题标题】:Korn Shell Scripting header errorKorn Shell 脚本头错误
【发布时间】:2014-11-05 18:02:44
【问题描述】:

我刚刚找到一份工作,我 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 对我来说还是很陌生。

【问题讨论】:

  • 试试dos2unix ./firstApp.ksh。祝你好运。
  • 再次检查thirdApp.ksh 的权限。我猜这不是 +x 正确的。

标签: bash shell unix scripting ksh


【解决方案1】:

在 Unix 中,位于脚本第一行第一列的 #! 称为 shebang。这是允许 Unix 执行程序找出您要用来处理 脚本 的程序的机制。如果您没有 shebang,您的脚本将使用您的 默认 shell 执行。

如果您的 shell 脚本中没有 shebang,但用户的默认 shell 是 Kornshell,那么一切都会好起来的。如果用户的默认 shell 是 C-shell,那么您的脚本将无法运行。因此,您应该始终使用 shebang。

shebang 的问题在于它不使用您的$PATH 来查找程序。相反,您必须拥有硬编码路径。如果你有:

#! usr/bin/ksh

而且,您在/home/opj 目录中,它将查找/home/opj/usr/bin/ksh。这是 non-working 脚本的问题。你需要那个开头/:

#! /usr/bin/ksh

当然,假设您的 Kornshell 应用程序在 /usr/bin/ksh 下,而不是在 /bin/ksh 下。大多数shell 都在/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,这就是我的脚本将使用的。

还有一件事。你为什么使用 Kornshell 而不是 BASH。 BASH 和 Kornshell 在语法上 95% 相同,但 BASH 现在更加普遍。我使用 Kornshell 是因为这是我在 20 世纪最后二十年学到的东西。我什至在我的 Mac 上安装了 Kornshell,只是因为我喜欢 Bash 中没有的功能。

但是,我建议新用户学习 BASH,只是因为如果他们遇到问题,那里有更多资源。

【讨论】:

    【解决方案2】:

    这些命令仅在根目录中运行时才有效。你需要:

    #!/usr/bin/ksh
    

    使用完整的绝对路径名(以 / 开头),而不是您使用的相对路径名:

    #!usr/bin/ksh
    

    请注意,为了相关,shebang (#!) 必须是文件中的前两个字符。前导空行或# 之前的行上的空白使其无关紧要;内核查看前两个字符是否为#!,如果不是,则忽略shebang 行。

    【讨论】:

    • 但是我怎么把两个脚本都放在同一个位置但是一个通过一个失败......这就是我真正不明白的,我只在 Unix/Linux 上玩了 2.5 个月所以请和我裸露
    • 我正在重读这个问题。开头是否有我们看不到的空白行? #! shebang 必须是文件中相关的前两个字符,并且路径的开头必须有一个 / 以保持理智。
    • shebang (#!) 之前的空白行让世界变得与众不同。 shebang 必须是文件中的前两个字符。
    • 这听起来像工作的有空行,这可以解释它。在这种情况下,它根本没有使用 shebang,而是由当前的 (bash) shell 运行。
    • 当内核因为文件不是以shebang开头而拒绝处理该文件时,Korn shell决定将其视为一个脚本,正常读取该脚本。空行无关紧要;以#! 开头的评论行无关紧要;其余的工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多