Shell脚本提示命令未找到。忽略shebang?

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

2
您需要为当前用户授予执行权限。 - JB.
5
你的usr文件夹里真的有sh吗? - Pavel Anossov
chmod 755 foo.sh,你的 shebang 可能是错误的。 - Jeremy D
3
可能该文件中有Windows换行符。 - hek2mgl
1
谢谢你们这些超级聪明的人。是的,在这台机器上,sh可执行文件在usr中,并且该文件对当前用户可执行。解决方案是换行符采用DOS格式,将其转换为nix格式使用nano即可。 - deed02392
显示剩余5条评论
4个回答

4
这可能是由以下几个原因之一造成的。列出最常见的原因:
  1. 该文件没有可执行权限。使用chmod a+x foo.sh为所有用户赋予执行权限。
  2. 您的shebang不正确,请仔细检查路径。使用which sh,然后将结果复制到#!之后。
  3. 您的行以DOS格式分隔。脚本需要用\n分隔。像nano这样的文本编辑器可以通过选择Write-out,然后按Alt+D切换DOS格式关闭来进行转换。诸如dos2unix之类的工具可以在命令行上直接转换文件(虽然可能需要先安装)。

1

您需要将脚本文件设置为可执行并重试。

chmod +x foo.sh

@deed02392 您的selinux是否已启用?您可以尝试将其关闭吗? - xaph

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的路径和可执行位。

0

嗯,我看到你的脚本是可执行的。但是 /usr/sh 让我有些困扰... 一些 UNIX/POSIX 系统没有它。大多数有这个的系统都是链接到更好的 shell。

尝试 ls -l /usr/sh 查看显示内容。

你也可以使用 printenv SHELL 并将结果用作脚本的 shell。由于它指向你的登录 shell,通常是一个不错的选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接