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


11

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

私は、スクリプトやバイナリを実行するさまざまな方法すべてに同意しません。それはすべて私にとって大きな混乱であり、何を使用するかを決定するために試行錯誤を繰り返さなければなりません。スクリプトまたはバイナリ<script/binary>であるファイルの場合、次の代替案を考え出すことができます。

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

(もっとありますか?)

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

ありがとう。

回答:


7

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

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

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

以下はほとんど同じで、現在のシェル環境で(バイナリではなく)シェルスクリプトを実行します。2つの行の小さな違いは、このUnix.SEの質問で説明されています

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

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

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


3

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

最初に、次の2つの点について述べます。

  • Linuxはコマンドパスを区別しますコマンドがプロンプト上にあるとしてのみ入力され、そして実行されます内蔵または対応するバイナリか、$ PATH上のスクリプトを探すためのLinuxの原因となります。

  • 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、コマンドによって実行されたとき、またはコマンドを使用したときに使用されます:scriptscriptPATH上にある必要があります)
  • を使用sh scriptすると、シバンは無視され、この場合shはインタプリタとして使用されます
  • . scriptor sourceを使用すると、シーバンが無視され、現在のインタープリターが使用されます(.or sourceは、現在のシェルでスクリプトの各行を実行するのと同じであるため)

脚注

* 1:これはほぼ真実です。bashで、彼らは確かに同じコマンドですが、使用している場合sourcescript$ PATHに検索されます前に、現在のディレクトリ。これはbashですが、POSIXのみのシェルでsourceは機能しませんが、.機能します。したがって、移植性のために後者を使用してください。

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


2

ここにコマンドの簡単なリストがあります。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
  • スクリプトは、引数を指定して実行することもできます。ルーテ(p。69)で説明されているように、シバン後のこのスクリプトの内容は次のmyfile.sh dogs cats birdsようになるThe 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

情報をありがとう。このステートメントは正しいですか:PATHにないスクリプトまたはバイナリを実行するには、パスを指定するだけです。現在のパスのスクリプトに./が必要な理由は、 'script.sh'は少なくとも1つのスラッシュ/がないため、コマンドとして解釈されるためです。
12

「インストールしたスクリプトを実行するには」、「インストールした」スクリプトとは何ですか?この点は前の点と同じですか?
12

@ Carl-最初のコメントは正しいですが、スクリプトに関する私の最後の2つの点が同じであると言うのは誤りです。スクリプトセクションのポイント5では、ユーザーがホームディレクトリのbinフォルダーに手動で追加したスクリプトについて話していました。ポイント6では、リポジトリからインストールしたget_iplayerなどのスクリプトについて話していました。そのため、常にユーザーのホームディレクトリではなく、システムフォルダーに移動します。

申し訳ありませんが、それでもまだ理解できません。〜/ bin /(PATHにあります)またはシステムフォルダー(PATHにあります)にあるスクリプト-どうすればそれらに違いがありますか?それらは異なる動作をしますか?
カール

ユーザーが所有していて〜/ binに追加するスクリプトと、システムフォルダーのrootが所有するスクリプトを区別しているところです。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.