名前が異なる2つの同様のスクリプトがあります。 1つはうまく機能しますが、もう1つはエラーが発生します。誰でも何が間違っているのか教えてもらえますか?
これは私の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でスクリプトを編集する場合は、Unixテキストファイルを生成するようにWindowsテキストエディタを設定してこれを実行できますが、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
。)
答え2
(検索がここで終わったので)test.shがあります。
#!/bin/bash
echo "test"
NixOSにコピーして入手しました。
-bash: ./test.sh: cannot execute: required file not found
Windowsキャリッジリターンを削除するためのデフォルトのvimメソッドを試しました。
: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
。