Linux Bash Shell 脚本错误:无法执行:找不到所需文件

Linux Bash Shell 脚本错误:无法执行:找不到所需文件

我有两个类似的脚本,但名称不同。一个工作正常,但另一个会抛出错误。谁能告诉我有什么问题吗?

这是我的 test.sh 脚本,运行良好

[nnice@myhost Scripts]$ cat test.sh 
#!/bin/bash
function fun {     
        echo "`hostname`"
}
fun 
[nnice@myhost Scripts]$ ./test.sh 
myhost.fedora

这是我的另一个脚本 demo.sh 但它抛出错误

[nnice@myhost Scripts]$ cat demo.sh 
#!/bin/bash
function fun { 
    echo "`hostname`"
}
fun
[nnice@myhost Scripts]$ ./demo.sh 
bash: ./demo.sh: cannot execute: required file not found

两个脚本具有相同的权限

[nnice@myhost Scripts]$ ll test.sh 
-rwxr-xr-x. 1 nnice nnice 65 Oct 21 10:47 test.sh
[nnice@myhost Scripts]$ ll demo.sh 
-rwxr-xr-x. 1 nnice nnice 58 Oct 21 10:46 demo.sh

答案1

您的demo.sh脚本是一个 DOS 文本文件。此类文件具有 CRLF 行结尾,并且行末尾的额外 CR(回车)字符会导致出现问题。

具体的它引起的问题是#!- 行上的解释器路径名现在指的是所谓的东西/bin/bash\r(象征着\r回车符,这是一个类似空格的字符,所以它通常不可见)。找不到该文件,因此这就是导致错误消息的原因。

要解决此问题,请将脚本从 DOS 文本文件转换为 Unix 文本文件。如果您在 Windows 上编辑脚本,则可以通过配置 Windows 文本编辑器来创建 Unix 文本文件来完成此操作,但您也可以使用dos2unix适用于大多数常见 Unix 变体的实用程序。

$ ./script
bash: ./script: cannot execute: required file not found
$ dos2unix script
$ ./script
harpo.local

关于您的代码:请不要执行echo `some-command`echo $(some-command)输出some-command.直接使用命令即可:

#!/bin/sh

fun () {
    hostname
}

fun

(由于脚本现在不使用任何需要的东西bash,我也转向调用更简单的/bin/shshell。)

答案2

(因为我的搜索结束在这里),我有 test.sh

#!/bin/bash
echo "test"

我复制到 NixOS 并得到

-bash: ./test.sh: cannot execute: required file not found

我尝试了默认的 vim 方法来删​​除 Windows 回车符:

:e ++ff=unix 
:%s/\r\(\n\)/\1/g

但这没有帮助。

我将第一行更改为

#!/usr/bin/env bash

现在可以了。

我本可以把它改成

#!/bin/sh

因为我没有使用任何 bashism 但在另一个脚本中我曾是所以我需要一种很好的便携方式来调用 bash。

答案3

如果你打开文件可以看到文件右下角有notepad++回车符( ),你可以双击并更改为“Unix( )”。CL RFLF

参考下图

答案4

在我的实例中,在 Windows 上,这是由我尝试使用此 shebang#! /user/bin/bash而不是#!/bin/bash.

相关内容