Bashのsourceコマンドで関数と変数をシェル環境にインポートする方法
Linuxのシェルにログインすると、特定の作業環境を引き継ぎます。シェルにおける環境とは、あらかじめ設定された変数が存在し、あなたが入力するコマンドが意図したとおりに動作することを保証する仕組みのことです。たとえば、PATH環境変数はシェルがコマンドを探す場所を定義しています。この変数がないと、Bashで実行しようとするほぼすべてのコマンドがcommand not found(コマンドが見つかりません)というエラーで失敗してしまいます。普段の作業ではほとんど意識されることのない環境ですが、実は非常に重要な役割を担っているのです。
シェル環境に影響を与える方法はたくさんあります。~/.bashrcや~/.profileといった設定ファイルを編集したり、起動時にサービスを実行したり、独自のカスタムコマンドを作成したり、Bash関数をスクリプト化したりすることも可能です。
sourceコマンドで環境に追加する
Bash(および一部の他のシェル)には、sourceという組み込みコマンドが用意されています。ここで少し混乱しやすいポイントがあります。sourceは.(ドット1つだけのコマンド)と同じ機能を持っています。また、man sourceと入力したときに画面に表示されるかもしれないTcl言語のsourceコマンドとは別物です。実は、この組み込みのsourceコマンドはPATH上には存在しません。Bash自体に含まれているコマンドであり、詳細を知りたい場合はhelp sourceと入力すれば確認できます。
.コマンドはPOSIX準拠です。一方、sourceコマンドはPOSIXでは定義されていませんが、.コマンドと相互に置き換えて使うことができます。
Bashのhelpによると、sourceコマンドは「現在のシェル内で」ファイルを実行します。「現在のシェル内で」という部分が重要です。これはサブシェルを起動しないことを意味し、sourceで実行した内容はすべて現在の環境内で処理され、その環境に影響を与えるからです。
sourceが環境にどのような影響を与えるかを調べる前に、まずテストファイルに対してsourceを使い、期待どおりにコードが実行されることを確認してみましょう。まず、簡単なBashスクリプトを作成し、hello.shという名前で保存します。
#!/usr/bin/env bash
echo "hello world"
sourceを使えば、実行権限(実行ビット)を設定していなくてもこのスクリプトを実行できます。
$ source hello.sh
hello world
同様に、組み込みの.コマンドでも同じ結果が得られます。
$ . hello.sh
hello world
sourceと.のどちらのコマンドでも、テストファイルの内容が正常に実行されました。
変数の設定と関数のインポート
sourceを使うと、CやC++でライブラリを参照するincludeキーワード、Pythonでモジュールを読み込むimportキーワードのように、ファイルをシェル環境へ「インポート」できます。これがsourceの最も一般的な用途のひとつで、.bashrcファイルに.bash_aliasesというファイルを読み込む記述をデフォルトで入れておき、ログイン時に自分で定義したカスタムエイリアスがすべて環境に取り込まれるようにするのもよくある使い方です。
Bash関数をインポートする例を見てみましょう。まず、myfunctionsというファイルに関数を作成します。この関数は、グローバルIPアドレスとローカルIPアドレスを表示します。
function myip() {
curl https://icanhazip.com
ip addr | grep inet$IP | \
cut -d"/" -f 1 | \
grep -v 127\.0 | \
grep -v \:\:1 | \
awk '{$1=$1};1'
}
この関数をシェルにインポートします。
$ source myfunctions
新しい関数を試してみましょう。
$ myip
93.184.216.34
inet 192.168.0.23
inet6 fbd4:e85f:49c:2121:ce12:ef79:0e77:59d1
inet 10.8.42.38
sourceによるファイル検索の仕組み
Bashでsourceを使用すると、参照したファイルをまずカレントディレクトリから探します。この動作はすべてのシェルで共通ではないため、Bash以外のシェルを使っている場合は各ドキュメントを確認してください。
Bashが実行すべきファイルを見つけられなかった場合、今度はPATHを検索します。これもすべてのシェルのデフォルト動作ではないため、Bash以外を使用している場合はドキュメントで確認しておきましょう。
これらはどちらもBashの便利な機能です。この動作は驚くほど強力で、よく使う関数をドライブ上の一箇所にまとめて保管し、環境を統合開発環境(IDE)のように扱えるようになります。関数がどこに保存されているか気にする必要はありません。ローカル版の/usr/includeに相当する場所にあると分かっていれば、どこからsourceしてもBashが見つけてくれるからです。
たとえば、共通関数の保管場所として~/.local/includeというディレクトリを作成し、次のコードブロックを.bashrcファイルに記述しておきます。
for i in $HOME/.local/include/*;
do source $i
done
こうすることで、~/.local/include内のカスタム関数を含むすべてのファイルがシェル環境に「インポート」されます。
なお、sourceおよび.コマンド使用時にカレントディレクトリとPATHの両方を検索するのは、Bashだけの特徴です。
オープンソース開発でのsourceの活用
sourceや.でファイルを実行する方法は、環境に変更を加えながらも、その変更をモジュール化して管理できる便利な手段です。次に大きなコードブロックを.bashrcファイルにコピー&ペーストしようと思ったら、関連する関数やエイリアスのグループを専用のファイルに分けて保存し、sourceで読み込む方法を検討してみてください。設定の保守性が格段に向上するはずです。
-
ターミナルで賢く作業するためのBashのヒントとテクニック集
Linuxユーザーにとって、初めてターミナルを開き、最も効率的で強力かつ柔軟な方法でシステムを操作し始める瞬間は特別なものです。しかし、初めてターミナルに触れるときは、点滅するカーソルと無限の可能性だけが迎えてくれるため、少し敷居が高く感じられるかもしれません。そこで本記事では、ターミナルで「頑張る」のではなく「賢く」作業するためのBashのヒントとテクニックをご紹介します。 aproposでコマンドを検索する apropos(アプロポス)は、manページ(マニュアル)の説明文をもとにコマンドを検索できるコマンドです。何らかのコマンドのmanページを見たことがある方なら、以下のような表示を目に
-
Linuxのwatchコマンドの使い方と実用例をわかりやすく解説
Linuxのwatchコマンドは、指定したコマンドを一定間隔で繰り返し実行し、その結果を画面に表示し続けるためのツールです。コマンドの出力が時間とともにどう変化するかをリアルタイムで監視したい場合に非常に便利です。この記事では、watchコマンドの基本的な使い方と、覚えておくと役立つ実用的な例を紹介します。 watchコマンドの基本構文 watchコマンドの構文は以下のとおりです。 watch オプション コマンド 各要素の意味は次のとおりです。 オプション: 後述の表から選択したオプションを指定します。watchコマンドのデフォルト動作を変更できます。 コマンド: watchが繰り返し実行