我有两个类似的脚本,但名称不同。一个工作正常,但另一个会抛出错误。谁能告诉我有什么问题吗?
这是我的 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/sh
shell。)
答案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
答案4
在我的实例中,在 Windows 上,这是由我尝试使用此 shebang#! /user/bin/bash
而不是#!/bin/bash
.