Linux スクリプトの実行

ShellBeginner
オンラインで実践に進む

はじめに

このラボでは、Linuxにおける source コマンドの理解と活用に焦点を当てます。source は、現在のシェル環境でスクリプトを実行するための強力なツールです。通常のスクリプト実行が別のサブプロセスで実行されるのに対し、source コマンドは現在のシェル環境でファイル内のコマンドを実行します。これにより、スクリプト内で定義された変数や関数を現在のセッションで保持することができます。

このラボを通じて、以下のことを学びます:

  • source コマンドを使用してスクリプトを作成・実行する方法
  • source を使用する際にスクリプトへ引数を渡す方法
  • source コマンドと通常のスクリプト実行の違い
  • source コマンドを使用して環境変数を設定する方法

このラボを終える頃には、効率的なLinuxシェルスクリプト作成と環境管理のために source コマンドを使いこなせるようになっているはずです。

基本的なスクリプトの作成とソース実行

このステップでは、単純なスクリプトファイルを作成し、source コマンドを使用して現在のシェル環境で実行します。これにより、source が通常のスクリプト実行とどのように異なるかを理解します。

スクリプトを通常の方法(./script.sh)で実行すると、シェルはスクリプトを実行するために新しいサブプロセスを作成します。そのスクリプト内で定義された変数や関数は、そのサブプロセス内でのみ存在し、スクリプトが終了すると消滅します。しかし、source コマンド(またはその短縮形の .)を使用すると、スクリプト内のコマンドが現在のシェル環境で実行されるため、スクリプト完了後も変数や関数が保持されます。

この概念を実証するために、基本的なスクリプトを作成してみましょう。

1. プロジェクトディレクトリへの移動

まず、正しいディレクトリにいることを確認します:

cd ~/project

2. 単純なスクリプトファイルの作成

nanoエディタを使用して variables.sh という名前の新しいファイルを作成します:

nano variables.sh

ファイルに以下の内容を追加します:

#!/bin/bash
## This script sets an environment variable
export WEATHER="Sunny"
echo "The weather is now set to: $WEATHER"

Ctrl+O を押してファイルを保存し、Enter でファイル名を確認し、最後に Ctrl+X でnanoを終了します。

3. スクリプトを実行可能にする

スクリプトを実行する前に、実行権限を付与する必要があります:

chmod +x variables.sh

4. スクリプトを通常の方法で実行

まず、従来の方法でスクリプトを実行してみましょう:

./variables.sh

以下のような出力が表示されるはずです:

The weather is now set to: Sunny

次に、現在のシェルに WEATHER 変数が存在するか確認します:

echo $WEATHER

おそらく何も出力されないか、空行が表示されるはずです。これは、変数がスクリプトを実行したサブプロセス内でのみ設定され、現在のシェルには反映されていないためです。

5. スクリプトをソース実行する

次に、source コマンドを使用してスクリプトを実行してみましょう:

source variables.sh

同じ出力が表示されます:

The weather is now set to: Sunny

もう一度 WEATHER 変数を確認します:

echo $WEATHER

今度は以下のように表示されるはずです:

Sunny

source コマンドを使用してスクリプトを実行したため、WEATHER 変数が現在のシェルに存在しています。

6. 短縮表記の使用

source コマンドにはドット(.)の短縮表記も使用できます:

. ./variables.sh

これは source variables.sh を使用した場合と同じ結果になります。./ プレフィックスは、現在のディレクトリからスクリプトをソースすることをシェルに伝えます。

引数を伴うソース実行

このステップでは、source コマンドを使用する際にスクリプトへ引数を渡す方法を学びます。これは、スクリプトをより柔軟で再利用可能なものにするために役立ちます。

通常のスクリプト実行と同様に、source コマンドを使用する際にもスクリプトへ引数を渡すことができます。スクリプト内では、これらの引数は標準の位置パラメータ($1, $2 など)を通じてアクセス可能であり、直接スクリプトを実行する場合と同じです。

1. 引数を受け取るスクリプトの作成

~/project ディレクトリに greeting.sh という新しいファイルを作成します:

cd ~/project
nano greeting.sh

ファイルに以下の内容を追加します:

#!/bin/bash
## This script accepts a name parameter and sets a greeting variable

## Check if a parameter was provided
if [ -z "$1" ]; then
  NAME="Guest"
else
  NAME="$1"
fi

## Set the greeting environment variable
export GREETING="Hello, $NAME!"
echo "$GREETING"

Ctrl+OEnterCtrl+X の順に押して、nanoを保存して終了します。

2. スクリプトを実行可能にする

chmod +x greeting.sh

3. 引数を指定してスクリプトをソース実行する

スクリプトをソース実行し、名前の引数を渡してみましょう:

source greeting.sh "Alice"

以下の出力が表示されるはずです:

Hello, Alice!

次に、現在のシェルで GREETING 変数が設定されているか確認します:

echo $GREETING

以下のように表示されるはずです:

Hello, Alice!

4. 異なる引数でソース実行する

別の名前を指定して、もう一度スクリプトをソース実行してみます:

source greeting.sh "Bob"

出力:

Hello, Bob!

GREETING 変数を再度確認します:

echo $GREETING

出力:

Hello, Bob!

GREETING 変数が新しい値で更新されたことに注目してください。

5. 引数なしでソース実行する

引数なしでスクリプトをソース実行することもできます:

source greeting.sh

出力:

Hello, Guest!

引数が提供されない場合、スクリプトはデフォルト値("Guest")を使用します。

もう一度 GREETING 変数を確認します:

echo $GREETING

出力:

Hello, Guest!

これは、異なる入力パラメータを処理することで、スクリプトを適応可能にする方法を示しています。

開発環境構築用スクリプトの作成

このステップでは、より実践的な例として、複数の変数を設定して開発環境を構築するスクリプトを作成します。これは、実際のシナリオで source コマンドがよく使われるケースです。

1. 開発環境構築用スクリプトの作成

~/project ディレクトリに dev_env.sh という新しいファイルを作成します:

cd ~/project
nano dev_env.sh

ファイルに以下の内容を追加します:

#!/bin/bash
## Development environment setup script

## Database connection settings
export DB_HOST="localhost"
export DB_PORT="5432"
export DB_USER="dev_user"
export DB_PASSWORD="dev_password"
export DB_NAME="dev_database"

## API settings
export API_URL="http://localhost:3000/api"
export API_KEY="dev_api_key_123"

## Application paths
export APP_ROOT="/home/labex/project/app"
export LOG_DIR="/home/labex/project/logs"

## Create directories if they don't exist
mkdir -p $APP_ROOT
mkdir -p $LOG_DIR

## Display confirmation message
echo "Development environment configured with the following settings:"
echo "-----------------------------------------------------------"
echo "Database: $DB_USER@$DB_HOST:$DB_PORT/$DB_NAME"
echo "API URL: $API_URL"
echo "App Root: $APP_ROOT"
echo "Log Directory: $LOG_DIR"
echo "-----------------------------------------------------------"
echo "Environment is ready for development!"

Ctrl+OEnterCtrl+X の順に押して、nanoを保存して終了します。

2. スクリプトを実行可能にする

chmod +x dev_env.sh

3. 開発環境構築用スクリプトをソース実行する

それでは、スクリプトをソース実行して開発環境を構築します:

source dev_env.sh

以下のような出力が表示されるはずです:

Development environment configured with the following settings:
-----------------------------------------------------------
Database: dev_user@localhost:5432/dev_database
API URL: http://localhost:3000/api
App Root: /home/labex/project/app
Log Directory: /home/labex/project/logs
-----------------------------------------------------------
Environment is ready for development!

4. 環境変数が設定されたことを確認する

スクリプトによって設定された環境変数のいくつかを確認してみましょう:

echo "Database connection string: $DB_USER:$DB_PASSWORD@$DB_HOST:$DB_PORT/$DB_NAME"

出力:

Database connection string: dev_user:dev_password@localhost:5432/dev_database

API設定を確認します:

echo "API settings: $API_URL with key $API_KEY"

出力:

API settings: http://localhost:3000/api with key dev_api_key_123

5. ディレクトリが作成されたことを確認する

スクリプトで指定されたディレクトリが作成されたか確認します:

ls -la ~/project/app ~/project/logs

両方のディレクトリが存在することを示す出力が表示されるはずです。

この例は、source コマンドを使用して、複数の環境変数や設定を含む完全な開発環境を構築する方法を示しています。このアプローチは、開発ワークフローにおいて異なる環境(開発、テスト、本番など)を切り替える際によく使用されます。

まとめ

このラボでは、Linuxで source コマンドを使用して現在のシェル環境でスクリプトを実行する方法を学びました。達成した内容は以下の通りです:

  1. 基本的なスクリプトの作成とソース実行: source を使用すると、スクリプト内で定義された変数や関数が現在のシェルセッションで保持されるため、通常のスクリプト実行とは異なることを学びました。

  2. ソース実行するスクリプトへの引数の受け渡し: source コマンドを使用する際に引数を渡してスクリプトを柔軟にする方法と、スクリプト内でそれらの引数を処理する方法を探求しました。

  3. 開発環境の構築: 複数の環境変数と設定を含む開発環境を構築する実践的なスクリプトを作成しました。これは source コマンドの一般的な実用例です。

source コマンドは、Linuxスクリプトにおいて以下のことを可能にする強力なツールです:

  • シェルセッション全体で保持される環境変数の設定
  • セッション内で後から使用できる関数の定義
  • 再利用可能なモジュール式設定の作成
  • 複雑な環境の迅速かつ一貫したセットアップ

これらのスキルは、Linuxシステムを扱うすべての人、特に開発者、システム管理者、DevOpsエンジニアにとって不可欠です。source コマンドを習得することで、Linux環境を管理するためのより効率的で整理されたスクリプトを作成できるようになります。