1. 概要

このチュートリアルでは、 shebang (“#!”)を使用して、Unixライクなシステムに実行可能ファイルの解釈方法を指示する方法を説明します。

2. 仮説

実行可能ファイルを実行しようとすると、 execve プログラムが呼び出され、現在のプロセス(ターミナルを使用している場合は bash シェル)が新しいプロセスに置き換えられ、それがどの程度正確であるかが決定されます。終わり。

テキストファイルを実行しようとすると、execveは、ファイルの最初の2文字が「#!」(「shebang」または「hashbang」と読みます)の後にインタープリターへのパスが続くことを期待します。スクリプトの残りの部分を解釈するために使用されます。

3. シェルスクリプトの作成

シバンを使用する最も一般的なニーズは、シェルスクリプトを作成するときに発生します。

ユーザーに挨拶する簡単なスクリプトを書いてみましょう。

#!/bin/sh
echo "Hello, ${USER}"

“ / bin / sh” は、実際には sh (シェルコマンド言語)のsh互換実装へのシンボリックリンクです。

ほとんどの場合、 bash (Bourne-Again SHell)になりますが、移植性を確保したい場合は、シンボリックリンクを使用する必要があります。

また、これが機能するには、スクリプトが実行可能である必要があることを忘れないでください。 新しいスクリプトファイルを作成するときは、chmodコマンドを使用して実行可能にすることができます。

chmod +x name_of_the_file

4. 他の通訳者の使用

sh とは異なるインタープリターを使用して、簡単に実行可能なスクリプトを記述したい場合があります。実際、任意のELF実行可能ファイルを使用できます。

たとえば、実行時に自分自身を出力する技術的に正しい(おそらくあまり有用ではありませんが)スクリプトは次のとおりです。

#!/bin/cat
Hello World!

5. ユーザーのPATHを使用する

前の例では、Unixライクなシステムでは標準であるため、確実にわかっているプログラムの場所を使用しました。

残念ながら、常にそうとは限りません。 ただし、そのような状況で役立つトリックが1つあります。

env プログラムを使用して、ターゲットインタープリターの名前を引数として渡すことができます。 次に、envユーザーのPATH変数でインタープリターを検索します。

今回はNodeを使用して、もう1つの「Helloworld」スクリプトを作成しましょう。

#!/usr/bin/env node
console.log('Hello world!');

6. 結論

この簡単な記事では、シバンを使用して、スクリプトの解釈方法をシステムに指示する方法について説明しました。