我刚刚找到了一份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对我来说还是一个新手。
答案 0 :(得分:3)
这些命令仅在根目录中运行时才有效。你需要:
#!/usr/bin/ksh
使用完整的绝对路径名(以/
开头),而不是您拥有的相对路径名:
#!usr/bin/ksh
请注意,为了相关,shebang(#!
)必须是文件中的前两个字符。在#
之前的行上引出空白行或空白,使其无关紧要;内核查看前两个字符是否为#!
,如果不是,则忽略shebang行。
答案 1 :(得分: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
。这是非工作脚本的问题。你需要从/
开始:
#! /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
我的脚本会找到Perl解释器,它是在/usr/bin/perl
,/usr/local/bin/perl
还是#! /bin/ksh
下。事实上,Perlbrew在很大程度上取决于这种行为。
缺点是您不能强迫某人使用特定版本的解释器。如果我有{{1}},那就是我的脚本将使用的内容。
还有一件事。你为什么使用Kornshell而不是BASH。 BASH和Kornshell在语法上有95%相同,但BASH现在更普遍。我使用Kornshell,因为这是我在20世纪的最后二十年中所学到的。我甚至在我的Mac上安装了Kornshell,因为我喜欢它不在Bash中的功能。
但是,我建议新用户学习BASH,因为如果他们遇到问题,那里会有更多的资源。