はじめに
先日、他の方が作成されたスクリプトを拝見していたときに見つけた特殊変数 $_ があまり見慣れないものだったので、調べてみました。
検証環境
| |
スクリプトで使われていた $_ 特殊変数について
Bash では 全ての引数を表す $@ や 引数の数を表す $# 、 実行中のプロセス ID を表す $$ など、いくつか組み込み機能として提供されている変数があります。
$_ はそういった変数のうちの 1 つになります。
では、 $_ はどのような変数なのでしょうか。
$_ 変数は「直前に実行されたコマンドの最後の引数」を表す
$_ 変数は「直前に実行されたコマンドの最後の引数」を表します。
早速具体的な例を見ていきましょう。
$_ 変数が利用されていたコードは以下のようなものになっていました。
| |
こちらの命令を実際に実行してみたいと思います。
実行前、実行後にカレントディレクトリを出力してみます。
| |
こちらのコードからわかるのは、 $_ が hoge を示しているということです。
値を出力してみましょう。
| |
確かに $_ は hoge という値を示しています。
$_ は、直前に実行されたコマンドの引数を表す変数であることがわかります 。
もう一つ実験してみます。 直前に実行されたコマンドの引数が複数だった場合はどのような挙動になるでしょう?
| |
aa / bb / cc の 3 つの引数のうち、最後の引数 cc の値だけが格納されていることがわかりました。
$_ は、直前に実行されたコマンドの最後の引数を表す変数であることがわかります 。
ちょっとしたコマンドの連続であれば登場する変数を減らすことができる
$_ をうまく使えば、変数を上手にへらすことができます。
例えば以下のような操作を想定してみます。
- ディレクトリを作成
- 作成したディレクトリに移動
git initして Git ワークスペースとして初期化
$_ 変数を使わない場合、以下のように記述することができます。
| |
$_ 変数を使うことで、以下のように記述することができます。
| |
ステップ、変数ともに減らすことができました。
シェルスクリプトのファイル名を取得できる
$_ 特殊変数を使うことで、Bash シェルスクリプト内でそのスクリプトのファイル名を取得できます。
以下のようなシンプルなシェルスクリプト main.sh を用意します。
| |
実行してみます。
| |
ただし、シェバングを利用せずに bash コマンドの引数としてスクリプトを指定し実行すると、 bash コマンドのパスが出力されます。
| |
このような挙動のため、別の方法でシェルスクリプトのファイルパスを取得するのは別の方法が良さそうです。
ひとこと
$_ 変数は便利ではありますが、事前に知識が必要になるため、万人向けのスクリプトを想定すると可読性が高いとは言えません。
使い所に注意が必要ですね。