web-dev-qa-db-ja.com

Bashスクリプトは、空の行に「コマンドが見つかりません」と出力します

Debianのコマンドラインからbash scriptname.shを使用してスクリプトを実行するたびに、Command Not foundを取得してから、スクリプトの結果を取得します。

スクリプトは機能しますが、空行ごとに常にCommand Not Foundステートメントが画面に出力されます。各空白行はコマンドが見つからないという結果になります。

/varフォルダーからスクリプトを実行しています。

スクリプトは次のとおりです。

#!/bin/bash

echo Hello World

次を入力して実行します。

bash testscript.sh

なぜこれが起こるのですか?

95
David

最初の行が以下であることを確認してください。

#!/bin/bash

/bin/bashでない場合は、bashへのパスを入力してください


実行してみてください:

dos2unix script.sh

行末などをWindowsからUNIX形式に変換します。つまり、行末から\ r(CR)を取り除き、それらを\r\n (CR+LF)から\n (LF)に変更します。

dos2unixコマンドの詳細(マニュアルページ)


ファイルがdos/Win形式であるかどうかを確認する別の方法:

cat scriptname.sh | sed 's/\r/<CR>/'

出力は次のようになります。

#!/bin/sh<CR>
<CR>
echo Hello World<CR>
<CR>

これにより、ファイル内の<CR>文字ごとに\rが表示されたファイルテキスト全体が出力されます。

148
chown

bash -x scriptname.shを使用してトレースできます。

53
clyfish

私も同様の問題に遭遇しました。問題は許可のようです。 ls -lを実行すると、ファイルの実行ビットがオンになっていない可能性があることを識別できる場合があります。これは、スクリプトの実行を許可しません。 :)

@artooroがコメントに追加したように:

この問題を修正するには、chmod +x testscript.shを実行します

38
Lypso345

スクリプトが(比較的)うまく機能している場合は、正常に実行されています。問題は、おそらく、パス上にない、インストールされていない、つづりが間違っている、または類似したプログラムを参照するファイル内の1行です。

1つの方法は、スクリプトの先頭にset -xを配置するか、単にbashの代わりにbash -xで実行することです。これにより、実行前に行が出力されます。問題

あなたが言うように、それが問題を引き起こしている空行であるなら、あなたは実際に何をチェックしたいかもしれませんinそれら。実行:

od -xcb testscript.sh

また、Windowsタイプのエディタを使用して取得できるCTRL-M(キャリッジリターン)のような「見えない」変な文字がないことを確認してください。

10
paxdiablo

スクリプトファイルでdos2unixを使用します。

7
bash-o-logist

これは些細なことであり、OPの質問とは関係ありませんが、スクリプト作成を学習していたときに、最初はよく間違えていました。

VAR_NAME = $(hostname)
echo "the hostname is ${VAR_NAME}"  

これにより、「コマンドが見つかりません」という応答が生成されます。正しい方法は、スペースを削除することです

VAR_NAME=$(hostname)
6
altamont

Notepad ++があり、この.shエラーメッセージが表示される場合:"command not found"またはこのautoconfエラーメッセージ "line 615:../../autoconf/bin/autom4te:そのようなファイルやディレクトリはありません」

Notepad ++で編集-> EOL変換に移動してからMacinthos(CR)をチェックします。これにより、ファイルが編集されます。また、すぐにこのようなエラーが発生するため、このコマンドですべてのファイルを確認することをお勧めします。

6
Juniar

実行するためには、たとえばその完全なパスを提供する必要があります

/home/Manuel/mywrittenscript
5
Masood Moghini

chmod u+x testscript.shを試してください

私はここからそれを知っています: http://www.linuxquestions.org/questions/red-hat-31/running-Shell-script-command-not-found-202062/

5
Aminah Nuraini

Bash for Windowsでは、間違って実行しようとしました

run_me.sh 

先頭に./がなく、同じエラーが発生しました。

Windowsのバックグラウンドを持つ人々にとって、正しいフォームは冗長に見えます:

./run_me.sh
3

同じ問題がありました。あいにく

dos2unix winfile.sh
bash: dos2unix: command not found

変換するためにこれを行いました。

 awk '{ sub("\r$", ""); print }' winfile.sh > unixfile.sh

その後

bash unixfile.sh
3
Eugene Cuz

スクリプトの実行に関する問題は、複数行コマンドの不適切な書式設定にも関連している場合があります。たとえば、改行「\」の後に空白文字がある場合です。例えば。この:

./run_me.sh \ 
--with-some parameter

(「\」の後に余分なスペースがあることに注意してください)、問題が発生しますが、そのスペースを削除すると、完全に正常に実行されます。

2
Marek Wysocki

今日私はこれに出くわして、ぼんやりとドルコマンドプロンプト$(コマンド文字列の前)をスクリプトにコピーしました。

0
CNSKnight

Cannot execute commandの一部も持っていました。すべてが正しいように見えましたが、実際には、コマンドの直前に壊れないスペース&nbsp;がありました。

if [[ "true" ]]; then
  &nbsp;highlight --syntax js "var i = 0;"
fi

Vimでは、次のようになりました。

if [[ "true" ]]; then
  highlight --syntax js "var i = 0;"
fi

Bashスクリプトチェッカーshellcheckを実行して初めて問題が見つかりました。

現在のディレクトリ(。)をPATHに追加して、名前を入力するだけで、現在のディレクトリにあるスクリプトを実行できるようにします。

PATH=.:$PATH
0
Mike Goethals

入力するコマンドを認識するために、エイリアスを使用して.bashrcファイルと.bash_profileファイルを更新することができます。

.bashrcおよび.bash_profileファイルは、おそらくプログラムファイルを保存するC:ドライブにある隠しファイルです。

0
Kean Amaral