この記事でも、引き続きシェルに関する機能を紹介します。 この記事で紹介する機能は、
の3つの機能です。
補完は入力の手間を省くためのもので、ワイルドカードは複数のファイルを一括指定するためのものです。 コマンド置換は、コマンドの実行結果を他のコマンドの引数として埋め込むための機能です。
また、この記事でも "UNIX系OSでは何でもファイルとして扱う" ということを実感してもらおうと考えています。
まずは、補完から解説します。 それでは端末を開き、以下のように ls /sy と入力したままEnterキーは押さないでください。
taro@myhostname:~$ ls /sy
続いて、キーボードのTabキーを押してください。 以下のようにディレクトリ名が自動的に入力されます。
taro@myhostname:~$ ls /sys/
/sys というディレクトリが存在していたため自動的に入力してくれました。 このように、Tabキーを押すことでファイル名やディレクトリ名が自動的に補完されます。
では続けて、以下のようにさらに cl と入力します。 なお、Enterキーはまだ押さないでください。
taro@myhostname:~$ ls /sys/cl
では、さらに補完しましょう。 キーボードのTabキーを押します。 以下のようにディレクトリ名が補完されます。
taro@myhostname:~$ ls /sys/class/
補完の解説は以上です。 このように、補完の機能を使うことでキーボードからのファイルパスやディレクトリパスの入力の手間を省くことができます。
ここからはワイルドカードの解説に入ります。 キーボードからさらに入力して ls /sys/class/leds/*/brightness というコマンドにして、Enterキーを押してください。
ls /sys/class/leds/*/brightness
以下のようにファイルの一覧が表示されます。 なお、ここで表示される一覧はPCの機種によって大幅に異なります。
taro@myhostname:~$ ls /sys/class/leds/*/brightness /sys/class/leds/input3::capslock/brightness /sys/class/leds/input3::numlock/brightness /sys/class/leds/input3::scrolllock/brightness /sys/class/leds/phy0-led/brightness /sys/class/leds/platform::micmute/brightness /sys/class/leds/platform::mute/brightness /sys/class/leds/tpacpi::power/brightness /sys/class/leds/tpacpi::standby/brightness /sys/class/leds/tpacpi::thinklight/brightness /sys/class/leds/tpacpi::thinkvantage/brightness taro@myhostname:~$
入力したコマンドは、
ls /sys/class/leds/*/brightness
でしたが、10個のファイルが表示されました。 どうやら *(アスタリスク) に秘密がありそうです。
そうです、*(アスタリスク) がワイルドカードと呼ばれるものです。 シェルのコマンド中に登場する *(アスタリスク) は、任意の長さの任意の文字に一致するのです。 例えば、
ls ca*
というコマンドを実行すると、cat category car captain candy のような "ca" で始まる全ての ファイルが表示されます。
なお、ワイルドカードには ?(クエスチョンマーク) もあります。 こちらは任意の1文字に一致します。 例えば、
ls ca??
というコマンドを実行すると、camp call のような "ca" で始まる4文字のファイルが表示されますが、cat や candy は表示されません。
つまり、今回実行した、
ls /sys/class/leds/*/brightness
というコマンドは、ルートディレクトリの下の sys ディレクトリの下の class ディレクトリの下の leds ディレクトリの下の任意のディレクトリの下の brightness というファイルを表示しろ、という意味になったのです。
このように複数のファイルをまとめて指定するための機能がワイルドカードです。
ワイルドカードの解説はこれで終え、ここからはコマンド置換の解説に入ります。 コマンド置換というのは、コマンドの実行結果を他のコマンドの引数として埋め込むための機能です。
では、キーボードから cat `ls /sys/class/leds/*/brightness` と入力して、Enterキーを押してください。
cat `ls /sys/class/leds/*/brightness`
以下のように10個の数字(0 または 1)が表示されます。
taro@myhostname:~$ cat `ls /sys/class/leds/*/brightness` 0 0 0 1 0 0 0 0 0 0 taro@myhostname:~$
表示された10個の数字は `(逆引用符) で囲まれた部分である、
ls /sys/class/leds/*/brightness
というコマンドで表示された以下の10個のファイルの中身です。
/sys/class/leds/input3::capslock/brightness /sys/class/leds/input3::numlock/brightness /sys/class/leds/input3::scrolllock/brightness /sys/class/leds/phy0-led/brightness /sys/class/leds/platform::micmute/brightness /sys/class/leds/platform::mute/brightness /sys/class/leds/tpacpi::power/brightness /sys/class/leds/tpacpi::standby/brightness /sys/class/leds/tpacpi::thinklight/brightness /sys/class/leds/tpacpi::thinkvantage/brightness
順を追って説明します。 まず、シェルがあなたから受け取った命令は、
cat `ls /sys/class/leds/*/brightness`
という命令です。 この命令には `(逆引用符) が含まれています。 そのためシェルは `(逆引用符) で囲まれた部分を最初に実行します。 つまり、
ls /sys/class/leds/*/brightness
というコマンドをひとまず実行します。 コマンドの実行結果は、
/sys/class/leds/input3::capslock/brightness /sys/class/leds/input3::numlock/brightness /sys/class/leds/input3::scrolllock/brightness /sys/class/leds/phy0-led/brightness /sys/class/leds/platform::micmute/brightness /sys/class/leds/platform::mute/brightness /sys/class/leds/tpacpi::power/brightness /sys/class/leds/tpacpi::standby/brightness /sys/class/leds/tpacpi::thinklight/brightness /sys/class/leds/tpacpi::thinkvantage/brightness
という10個のファイルの一覧です。
結果を受け取ったシェルは `(逆引用符) で囲まれた部分をその結果で置き換えます。 置き換えられた結果は、
cat /sys/class/leds/input3::capslock/brightness /sys/class/leds/input3::numlock/brightness /sys/class/leds/input3::scrolllock/brightness /sys/class/leds/phy0-led/brightness /sys/class/leds/platform::micmute/brightness /sys/class/leds/platform::mute/brightness /sys/class/leds/tpacpi::power/brightness /sys/class/leds/tpacpi::standby/brightness /sys/class/leds/tpacpi::thinklight/brightness /sys/class/leds/tpacpi::thinkvantage/brightness
となります。 つまり、cat コマンドに10個のファイルのファイルパスを引数として渡す命令になります。
シェルは次に、置き換えられた後の命令を実行します。 その結果、以下のように10個のファイルの中身が表示される、ということになります。
0 0 0 1 0 0 0 0 0 0
このように、あるコマンドの実行結果を別のコマンドの引数として埋め込むことができます。 これが、コマンド置換の機能です。
これで、補完・ワイルドカード・コマンド置換の3つの機能の紹介を終えました。 終えましたが、みなさん疑問に思っていることでしょう。 表示された10個のファイルの中身である 0 または 1 は何なのかと。
ディレクトリパスに leds というディレクトリが含まれていることから予想した方もいるかもしれませんが、これらはLEDの点灯状態を示す数値です。
みなさんがお使いのキーボードには NumLock / CapsLock / ScrollLockキーに対応したLEDがあると思います。 ノートPCであれば、それ以外のLEDも搭載されていることでしょう。 それらのLEDの点灯状態が表示されているのです。 0 が消灯状態を、1 が点灯状態を表しています。
ではここで、キーボードのLEDの点灯状態を変えてみましょう。 キーボードの NumLockキー や CapsLockキー や ScrollLockキーを押せばいいでしょう。 なお、LEDの点灯状態が変わる操作であれば、他の操作でも構いません。
では、再度LEDの点灯状態を確認してみましょう。 キーボードから cat `ls /sys/class/leds/*/brightness` と入力して、Enterキーを押してください。
cat `ls /sys/class/leds/*/brightness`
以下のようにLEDの点灯状態が表示されます。 点灯状態を表す 1 が増えました。
taro@myhostname:~$ cat `ls /sys/class/leds/*/brightness` 1 0 0 1 0 1 0 0 0 0 taro@myhostname:~$
このように、UNIX系OSではLEDさえもディレクトリツリーの中のファイルとして扱われるのです。 "UNIX系OSでは何でもファイルとして扱う" ということを実感してもらえたでしょうか。
本ウェブサイトでは、ディレクトリの内容を表示するためのコマンドとして ls コマンドを紹介しました。 この ls コマンドを使うことなく、カレントディレクトリのファイル一覧を表示させるにはどうすればいいでしょうか。
なお、find コマンドなどの本ウェブサイトに登場していないコマンドを使うというのはナシです。
思いついたのは echo コマンドの引数にワイルドカードを記述する方法です。 キーボードから echo * と入力して、Enterキーを押してください。
echo *
以下のようにカレントディレクトリのファイルの一覧が表示されます。
taro@myhostname:~$ echo * Desktop Documents Downloads Music Pictures Public Templates Videos testfile taro@myhostname:~$
これはもちろん、
echo *
というコマンドがシェルによって、
echo Desktop Documents Downloads Music Pictures Public Templates Videos testfile
というコマンドに置き換えられて実行された結果です。 echo コマンドに *(アスタリスク) が渡されたわけではありません。
シェルには補完の機能があり、Tabキーを押すことでファイル名やディレクトリ名を補完することができます。 候補が複数ある場合には、さらにTabキーを押すことで候補を一覧表示することができます。
ワイルドカードの *(アスタリスク) や ?(クエスチョンマーク) を使うことで、複数のファイルやディレクトリを一括で指定することができます。 *(アスタリスク) が任意の長さの任意の文字を表し、?(クエスチョンマーク) が任意の1文字を表します。
コマンド置換の機能を使うことで、あるコマンドの実行結果を別のコマンドの引数として埋め込むことができます。 `(逆引用符) で囲まれた部分が置換されます。