web-dev-qa-db-ja.com

バイナリとスクリプトを実行するさまざまな方法

私はしばらくの間Linuxを使用しており、これの完全な概要を探していましたが、見つかりませんでした。

スクリプトやバイナリを実行するさまざまな方法に対応できません-私にとっては非常に面倒で、何を使用すべきかを判断するには試行錯誤をしなければなりません。スクリプトまたはバイナリ<script/binary>であるファイルの場合、次の代替案を思いつくことができます。

<script/binary>
. <script/binary>
./<script/binary>
source <script/binary>
sh <script/binary>

(もっとありますか?)

誰かがどのコマンドがどの種類のファイルで機能するのか、複数のオプションがある場合の違いは何ですか?

ありがとう。

8
Carl

次のコマンドは同じですが、ドットコンポーネントは「現在のディレクトリ」を意味します。実行を許可するには、ファイルに実行可能権限が必要です。

path/to/binary
./path/to/binary

パスにスラッシュが含まれていない場合、コマンド(シェル組み込みコマンドまたは$PATH環境変数で検索されるプログラム)として扱われることに注意してください。

以下はほとんど同じで、現在のシェル環境でShellスクリプト(バイナリではありません!)を実行します。この2つの行のわずかな違いについては、この nix.SEの質問 で説明しています。

. path/to/script
source path/to/script

最後に、sh scriptについて言及しました。繰り返しますが、これはShellスクリプトでのみ機能し、バイナリでは機能しません。基本的に、スクリプト名を引数としてshプログラムを実行しています。 shの場合、この引数をシェルスクリプトとして扱い、実行します。

シェルスクリプトに限定された回答については、 シェルスクリプトを実行するさまざまな方法 を参照してください。

4
Lekensteyn

すべての入力をありがとう。ここで、自分の質問に答えて、スクリプトとバイナリを実行するさまざまな可能性についての完全なガイドを提供します。編集してコメントしてください。完全で正しいものを思い付くことができます。私の提案は次のとおりです。

最初に、述べるべき2つのポイント:

  • Linuxは、commandpathを区別します。 commandはプロンプトでそのまま入力され、組み込みを実行するか、Linuxに対応するバイナリまたはスクリプトを検索させます$ PATHで。

  • Linuxが何かをパスとして解釈するには、少なくとも1つのスラッシュ(/)が含まれている必要があります。例えば。 ./myScript./にはかなり冗長に見えるかもしれません-Linuxにコマンドではなくパスとして解釈させるためだけです。

したがって、バイナリまたはスクリプトを実行するためのオプション:

バイナリbinary:の実行

$ binary          # when 'binary' is on the PATH, or is a built-in
$ ./binary        # when 'binary' is not on the path but in the current directory
$ /home/me/binary # when 'binary' is not on the PATH, and not in the current dir

スクリプトの実行script

特に明記しない限り、ファイルには実行権限が必要です。

$ script        # execute a script that is on PATH. Will be executed in a new Shell.
                # The interpreter to use is determined by the she-bang in the file.
$ ./script      # execute a script that is in the current dir. Otherwise as above.
$ /a/dir/script # when the script is not on the PATH and not in current dir. 
                # Otherwise as above.
$ . script      # execute a script in the current dir. Will be executed in the
                # current Shell environment.
$ source script # equivalent to the above *1
$ sh script     # executes 'script' in a new Shell *2 (the same goes for 'bash ...',
                # 'zsh ...' etc.). Execute permission not neccessary.

彼女の前髪について

最初の行にシェバン(例:#!/bin/sh)が付いたスクリプトは、使用するインタープリターを示します。

  • このインタープリターは、./scriptまたはコマンドを使用して実行されるときに使用されます:scriptscriptはPATH上になければなりません)
  • sh scriptを使用すると、she-bangは無視され、この場合はshがインタープリターとして使用されます。
  • . scriptまたはsourceを使用すると、she-bangは無視され、現在のインタープリターが使用されます(.またはsourceは、現在のシェルでスクリプトの各行を実行するのと同じです)

脚注

* 1:これはほとんど事実です。 bashでは実際には同じコマンドですが、sourceを使用すると、scriptが$ PATHbeforeで検索されます現在のディレクトリ。これはbashですが、POSIXのみのシェルでは、sourceは機能しませんが、.は機能します。移植性のために後者を使用してください。

* 2:実際に起こることは、引数として 'script'を使用してバイナリshを実行することです。これにより、新しいシェルで 'sh'が 'script'を実行します。

3
Carl

コマンドの簡単なリストを以下に示します。 PATHに言及するとき、システムが知っているプログラムを含むディレクトリを意味することに注意してください。 echo $PATHでそれらを見つけると、次のようになります:/home/mike/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

スクリプト

  • 現在の作業ディレクトリでスクリプトを実行するには、./myscript.shを使用します
  • 別のファイルでスクリプトを実行するには、(現在の作業ディレクトリにある場合)./myscript.sh textfile.txtを使用します
  • スクリプトは引数を指定して実行することもできます。 Rute (p。68)で説明されているように、myfile.sh dogs cats birdsThe first argument is: dogs, second argument is: cats, third argument is: birdsを出力します。これは、シバン後のこのスクリプトのコンテンツがecho "The first argument is: $1, second argument is: $2, third argument is: $3"であるためです。

  • 別のディレクトリでスクリプトを実行するには、~/Scripts/dogs.shを使用します

  • ホームディレクトリのbinフォルダーにあるためにシステムが知っているスクリプトを実行するには(PATHに自動的に追加されるため、存在しない場合は作成します)、scriptnameを使用します。
  • インストールしたスクリプトを実行するには、システムに認識されるため、その名前を使用します。たとえば、get_iplayer

バイナリ

  • $ PATHにあるためにシステムが認識しているバイナリを実行するには、プログラムの名前とパラメーター(たとえば、vlc <stream url to open>)を使用します。
  • / usr/local/binにインストールする前にコンパイルしたバイナリをテストするか、スタンドアロンプ​​ログラムをシステムから遠ざけるには、~/<folder>/app/myprogを使用します
2
user76204