~からMark G. Sobell の Linux コマンド、エディタ、シェルプログラミングに関する実用ガイド
bashを使用してシェルスクリプトを実行できますが、この手法を使用すると、自分に実行権限を付与してスクリプトを直接呼び出すよりも、スクリプトが遅くなります。
なぜそんなことですか?
- 実行可能ファイルのようにスクリプトを実行することとシェルを介して明示的に実行することの違いは何ですか?
どちらも以下の同じ手順に従います。
コマンドラインのコマンドを使用すると、シェルは新しいプロセスを分岐してシェルプロセスのコピー(サブシェル)を作成します。新しいプロセスがコマンドの実行を試みます。フォークと同様に、execルーチンはオペレーティングシステム(システムコール)によって実行されます。コマンドがシェルスクリプトであるため、execは失敗します。 exec が失敗すると、コマンドはシェルスクリプトと見なされ、サブシェルはスクリプトのコマンドを実行します。コマンドラインからの入力が必要なログインシェルとは異なり、サブシェルはファイル(つまりシェルスクリプト)から入力を受け取ります。
ベストアンサー1
スクリプトがBashスクリプト(例えばで始まる#!/bin/bash
)であると仮定すると、作成者はその点で間違っていました。シェルスクリプトを直接実行すると、カーネルは最初にその#!/bin/bash
行を表示し、スクリプトのファイル名を引数として使用します/bin/bash myscript.sh
。つまり、カーネルは明示的にシェルに渡した場合に何をすべきかを正確に実行します。
スクリプトが#!/bin/sh
代わりに起動すると、#!/bin/bash
別の可能性があります。 Bashを提供できますが、/bin/sh
必須ではありません。また、サイズや速度よりも機能を優先します。より小さく高速なシェルを使用している場合は、スクリプトを/bin/sh
直接実行すると高速なシェルが使用され、スクリプトはBashでより高速に実行されます。
これは実際にはDebianベースのディストリビューション(Debian、Ubuntu、Mintなど)で発生します。彼らはブートスクリプトをより速く実行するためにBashの代わりにdash
Providerというシェルを使用する傾向があります。/bin/sh
ディストリビューションの機能を確認するには、ls -l /bin/sh
シンボリックリンク/bin/bash
または/bin/dash
他のシェルにすることができます。