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


111

bash scriptname.shDebianのコマンドラインからを使用してスクリプトを実行するたびCommand Not foundに、スクリプトの結果が表示されます。

スクリプトは機能しますが、常にCommand Not Found空の行ごとに画面に出力されるステートメントがあります。空白行ごとに、コマンドが見つかりません。

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

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

#!/bin/bash

echo Hello World

次のように入力して実行します。

bash testscript.sh

なぜこれが起こるのでしょうか?


真剣に、ネットはそのような不満でいっぱいです。シェルは非常に弱くて足りない通訳です。あちこちで少し失敗します。スクリプト内のすべての空白も監視する必要があります。目に見えない改行文字が原因でスクリプトが失敗しました。おそらく、これは空白を数えることが唯一のスクリプト言語です!
Atul

1
bash -x scriptname.shエラーをトレースするために使用します。–私の場合、それはWindowsで保存されたshファイルで、VSCodeと行末が "CRLF"でした。右下隅のVSCodeでは、行終端記号を「CRLF」から「LF」に変更できます。このファイルをアップロードし、最終的にで実行できましたbash scriptname.sh
Kai Noack

これは間違いなくstackoverflow.com/questions/39527571/…の複製ですが、ここでの多くの回答は、他の理由で「コマンドが見つかりません」という他の多くの状況を説明しています。問題が特に空行に関するものでない場合、訪問者はすべての回答読むことをお勧めします
トリプリー

回答:


161

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

#!/bin/bash

ない場合は、bashへのパスを入力します /bin/bash


実行してみてください:

dos2unix script.sh

これは、行末などをWindowsからUNIX形式に変換します。すなわち、それは行末から\ R(CR)はからそれらを変更するにはストリップ\r\n (CR+LF)\n (LF)

dos2unixコマンドの詳細(manページ)


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

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

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

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

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


彼がそれを直接実行しているので、おそらくそれは必要ではありませんbash scriptname.sh(もちろん、それはもちろん良い習慣です)。
paxdiablo

1
こんにちは#!/ bin / bashは私のスクリプトの最初の行です
David

1
@chown-Macでも同じ問題が発生しました。私はこの投稿を偶然見つけました。それがOPに役立ったかどうかはわかりません。しかし、あなたの解決策は私を助けました。
Prashant

1
ありがとう。これはまさに私が直面していた問題でした。これでうまくいきました。
slayedbylucifer 2012

5
運転中にプログラミングの質問に対する回答をどのように書くことができますか?
Omar Tariq 2016


47

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

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

その問題を修正するには chmod +x testscript.sh


4
その問題を修正するにはchmod +x testscript.sh
artooro

これは私のために働いた答えでした、常に私には許可がないと言われたので、私はそれをsudoし、コマンドが見つからないと言われました。権限をチェックするつもりはなかった。
DiamondDrake 2016年

1
Lypso345のおかげで、これで私が抱えていた問題が解決しました。
ammills01 2016

FTWのchmod 777 testscript.sh
GeneCode

16

これは取るに足らないことで、OPの質問とは関係ないかもしれませんが、スクリプトを学習しているとき、最初はよく間違えました。

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

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

VAR_NAME=$(hostname)

11

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

1つの方法はset -x、スクリプトの先頭にを配置するか、スクリプトbash -xを単に実行するのではなく実行することです。これによりbash、実行前に行が出力されます。通常、エラーの直前のコマンド出力を見て、問題の原因を確認する必要があります。

あなたが言うように、問題を引き起こしているのが空白行である場合それらの中で実際何が行わているかを確認する必要があるかもしれません。実行:

od -xcb testscript.sh

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


「od」コマンドの+1!かっこいい、知らなかった!ありがとう!
chown

11

WindowsのBashで、実行に失敗しました

run_me.sh 

最初に./なしで同じエラーが発生しました。

Windowsの背景を持つ人々にとって、正しいフォームは冗長に見えます。

./run_me.sh



6

それを実行するには、たとえばそのフルパスを提供する必要があります

/home/Manuel/mywrittenscript

実際、シェルはファイル拡張子をまったく気にしません。これが別の回答として投稿されるメリットはわかりません。
Tripleee 2016

もちろん、Windowsの拡張子にLinuxのファイルシステム.IN反対は、名前の一部としてのみ使用し、ファイルのcontent.Iについて何も言わないしてはならないと言っている私の場合には制約。
Masood Moghini、2016

6

Notepad ++を使用していて、この.shエラーメッセージが表示される場合:「command not found」 またはこのautoconfエラーメッセージ「line 615:../../autoconf/bin/autom4te:No such file or directory」

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


これをありがとう。私の場合は、busybox linux distroでスクリプトを実行していました。スクリプトのすべての空行に同じエラーが見つかりませんでした。また、if / elseステートメントにも問題がありました。Notepad ++のEOLをUnixに変更すると修正されました。
GeneCode

4

同じ問題があった。残念ながら

dos2unix winfile.sh
bash: dos2unix: command not found

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

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

その後

bash unixfile.sh

2

スクリプトの実行に関する問題は、たとえば改行「\」の後に空白文字がある場合など、複数行コマンドの不適切なフォーマットに関連している可能性もあります。例えばこれ:

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

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


0

私もいくつか持っていました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、問題が見つかりました。


shellcheckはオンラインで利用できますが、もちろん、スクリプトを正確にコピーして貼り付ける必要があります。 shellcheck.net
tripleee

0

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



-1

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.