web-dev-qa-db-ja.com

sudo:./abc.sh:コマンドが見つかりません

端末に入力するコマンド:

chmod 777 abc.sh
Sudo ./abc.sh

すべてのシェルプログラムで同じエラーが発生しています。

.sh: command not found

この簡単なabc.shプログラムを含めると:

#!/bin/bash
# My first script
echo "Hello World!"

Sudo od -c ./abc.shの出力:

0000000 # ! / b i n / b a s h \n # M y
0000020 f i r s t s c r i p t \n \n e
0000040 c h o " H e l l o W o r l d
0000060 ! " \n \n
0000064

screenshot of terminal and abc.sh path(1)

screenshot of terminal and abc.sh path(2)

3
Nisheet Verma

この出力を調べます(abc.shが存在するディレクトリから):

$ type ./abc.sh
$ ./abc.sh

typeコマンドは、最初に./abc.shが見つかったことを確認します。そうでない場合、./abc.shファイルが見つからないと言って終了します。それから、それが見つからないファイル名についてそれが何であるかを見つけなければなりません。

また、スクリプトファイルの作成に使用しているエディターの名前は何ですか。 (wineを介して)Windowsの編集を誤って使用した場合、スクリプトの行末記号に問題が発生する可能性があります。

nanogeditなどを使用して編集してみてください。これらの推奨エディターのいずれかを使用して、abc1.shと同じサンプルファイルを作成し、編集した質問とまったく同じ行があることを確認します。


ところで、質問で与えたエラーメッセージを再現できる唯一の方法は、abc.shファイルのabc部分を省くことです。

これらのコマンドはメッセージのエラーを生成します:

$ ./.sh
$ Sudo .sh

各エラーは一意であり、問​​題の診断において重要であることに留意してください。スクリプトをテストおよび正確に実行し、正確なエラーメッセージを提供することが重要です。

たとえば、実行ビットが設定されていないファイルを実行しようとすると、permission deniedエラーが発生する可能性があります。これは、質問で参照するコマンドを実行することで設定できます。

$ chmod 777 abc.sh

rootが所有し、読み取り用に設定されたワールドまたはグループビットを持たないファイルを実行しようとすると、permission deniedエラーが発生することもあります。これは、不要な場合にSudoを個人用スペースで使用すると副作用になる可能性があります。質問で言及したchmod 777は、すべてのユーザーに読み取りおよび実行の許可を与えることにより、その問題も解決します。

Rootが所有するようにファイルを作成した場合は、昇格したコマンドを使用してプロパティを変更する必要があります。これにより、ファイルを実行するためのアクセス権が付与されます。

$ Sudo chmod 777 abc.sh

誰がスクリプトを実行またはアクセスできるかを制御する理由がある場合は、chmodの他のオプションのいくつかを見ることができます。

$ man chmod

質問へのコメントで示唆されているように、昇格したコマンドSudoを使用して、テストするスクリプトを実行しないでください。テストが個人用スペースで行われている場合、個人用スペースの領域がrootによって所有されるようになる可能性があります...これらの領域への個人アクセスが失われます。不正な形式のスクリプトによっては、OSの他のシステムファイルが破損する可能性もあります。 abc.shスクリプトを実行しようとするミスタイプは、エラーが発生する可能性がある例です。スクリプトまたはスクリプト作業ディレクトリを削除することを決定し、間違った場所にスペースを誤って置いた場合、予想外の重大な問題を引き起こす可能性があります。

1
L. D. James

さて、あなたが私たちに言ったことから、それは完全に動作するはずです...それはそれが格納されているパーティションがunix/posixスタイルのパーミッションをサポートしている場合です。 vfatまたはntfsパーティションからスクリプトを実行しようとすると、常にこのエラーが発生します。 workと呼ばれる場所にマウントされていることを考えると、これはfatまたはntfsでフォーマットされたパーティションを持つUSBドライブにありますか?その場合は、スクリプトの前にシェルのプレフィックスを付ける必要があります。パーティションを確認してください。それが問題の可能性があります。それをホームディレクトリに移動すると、unix/posixパーミッションをサポートするファイルシステムで簡単に実行できます。

それが当てはまるかどうかを確認します。

mount |grep nisheet

たとえば、vfat、fuseblock、またはntfsですか?もしそうなら...

2つのオプション:

  1. 実行するスクリプトの前にシェルをプレフィックスします。

bash abc.sh

  1. Unix/Posixアクセス許可をサポートするファイルシステムに移動します。

例:

mv abc.sh ~/
cd ~
chmod +x abc.sh
./abc.sh
3
darkdragn