3

好像我的shebang被忽略了。当我尝试执行我编写的 shell 脚本时,出现错误:

% ls -alh /usr/sh
-r-xr-xr-x  1 root  1011   139k Sep 16 01:29 sh
% ls -alh foo.sh
-rwxr-xr-x  1 george george    21B Sep 16 00:59 foo.sh
% cat ./foo.sh
#!/usr/sh
echo "lol"
% ./foo.sh
./foo.sh: Command not found.
% sh ./foo.sh
lol

是的,它位于 /usr/sh。我把它放在那里。

但是正如你所看到的,当我指示sh执行它时它工作得很好。是什么赋予了?

我认为不$PATH适用,但在一些试图解决这个问题的搜索结果中,人们要求它:

% echo $PATH
/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/root/bin
4

4 回答 4

3

其原因可能是几件事之一。列出最常见的:

  1. 该文件没有可执行权限。用于chmod a+x foo.sh授予所有用户执行权限。
  2. 您的 shebang 不正确,请仔细检查路径。使用which sh并复制后的结果#!
  3. 您的行由 DOS 提要分隔。脚本需要用\n. 文本编辑器等nano允许您通过选择Write-out然后按Alt+D关闭 DOS 格式来进行转换。诸如dos2unix可以直接在命令行上转换文件的实用程序(尽管它可能需要先安装)。
于 2013-09-16T00:12:26.043 回答
1

您需要使您的脚本文件可执行并重试。

chmod +x foo.sh
于 2013-09-15T22:28:08.743 回答
0

你想要这样的东西:

% cat ./foo.sh
#!/bin/sh
echo "lol"
% chmod +x ./foo.sh
% ls -l ./foo.sh
-rwxr-xr-x  1 deed  deed  0 16 sep 00:33 ./foo.sh

注意/bin/sh的路径和可执行位。

于 2013-09-15T22:36:52.283 回答
0

好吧,我确实看到您的脚本是可执行的。困扰我的是 /usr/sh……一些 UNIX/POSIX 系统没有它。大多数这样做是指向更好外壳的链接。

试着ls -l /usr/sh看看那显示了什么。

您还可以printenv SHELL将结果用作脚本的外壳。由于这指向您的登录 shell,它通常是一个不错的选择。

于 2013-09-16T00:21:48.377 回答