web-dev-qa-db-ja.com

Linux:スクリプトでバイナリを実行する

スクリプトを介してプログラムを実行したい。通常、シェルに./programと入力すると、プログラムが起動します。

私のスクリプトは次のようになります。

#!/bin/sh
cd  /home/user/path_to_the_program/
sh program

それは失敗します、私は最後の行がうまくいかなかったと思います...

私はこれが幼稚な質問であることを知っていますが、たくさんあります!

11
co-worker

./programがシェルで機能する場合は、スクリプトで使用してみませんか?

#!/bin/sh
cd /home/user/path_to_the_program/
./program

sh programはshを起動して、programをシェルスクリプトとして解釈しようとします。ほとんどの場合、これはスクリプトではなく、他の実行可能ファイルであるため、失敗します。

11
Nick

入力すると

./program

シェルは、ファイルを実行する必要があると判断した方法に従って、プログラムを実行しようとします。バイナリの場合、エントリサブルーチンの実行を試みます。シェルがそれがスクリプトであることを検出した場合、たとえば、

#!/bin/sh

または

#!/bin/awk

またはより一般的に

#!/path/to/interpreter

シェルは、ファイル(および指定された引数)を引数として指定されたインタープリターに渡し、インタープリターはスクリプトを実行します。パスで指定されたインタープリターが存在しない場合、シェルはエラーになり、インタープリター行が見つからない場合、シェルは提供されたスクリプトがそれ自体で実行されると想定します。

コマンド

sh program

と同等です

./program

プログラムの最初の行にが含まれている場合

#!/bin/sh

/ bin/shがパス内のshであると想定します(たとえば、/ system/bin/shの場合があります)。バイナリをshに渡すと、shはそれをシェルスクリプトとして扱いますが、そうではなく、バイナリは解釈可能なシェル(プレーンテキスト)ではありません。だから使えない

sh program

この文脈で。また、プログラムがRuby、awk、sed、またはシェルスクリプトではないその他のものであるために失敗します。

3
user1207217

shは必要なく、$PATHにプログラムへのパスがないようです。

これを試して:

#!/bin/sh
cd  /home/user/path_to_the_program/
./program
2
codaddict

これで十分です:

/home/user/path_to_the_program/program

それでも問題が解決しない場合は、以下を確認してください。

  • 実行可能ビット
  • プログラムのシバン行(スクリプトの場合)
1

ここでは「sh」は必要ありません。最後の行に「プログラム」を単独で置くだけです。

0
Toucan