CUI 超入門
CUI とは、Character User Interface: キャラクタユーザインタフェースのことで、文字だけでコンピュータを操作する環境のことをいいます。 CLI (Command Line Interface) とも言います。
マウスやグラフィック画面で操作する GUI (Graphical User Interface) に対して呼ばれます。
文字だけで操作するので、覚えなくてなならないこともあり、敷居は高いです。
間違った操作をするとコンピュータが動かなくなることもあります。
本来なら、サーバにログインして操作しますが、練習なのでブラウザで操作できる以下の環境を利用します。
制約はありますが、ブラウザでオペレーティングシステムが動作するのは驚きです。
ブラウザで動作しているだけなので、いろいろなことを手軽に試すことができます。
root ユーザでログインするので、管理者向けのコマンドも実行できます。
JSLinux : Run Linux or other Operating Systems in your browser!
このサイトにアクセスするといろいろな環境が起動できることが分かります。
ここでは、以下の Linux 環境で説明します。
- CPU : riscv64
- OS : Linux (Buildroot)
- User Interface : Console
- Startup Link : click here -> これをクリックすると Linux がブラウザで起動します
無事起動出来たら、キーボードから文字を入力することで、いろいろな操作が行えます。
いろいろな操作といっても突き詰めれば、ほとんどの場合、ファイルの操作になります。
ファイルとは、コンピュータで扱うデータでファイル名という名前がついているものです。
※ 以下、コマンドプロンプトの [root@localhost ~] や関係のないファイル名などは適宜省略します。
※ 終了するときはブラウザを閉じて下さい。
※ 再びアクセスすると、前回までの操作はリセットされます。
ファイル操作
ファイルの基本的な操作を行ってみましょう。
ls - ファイルの一覧表示
どんなファイルがあるかみてみましょう。
プロンプト # の後に、キーボードで ls と打ち、"Enter" キーを押して下さい。
# ls
bench.py hello.c hello.js readme.txt rv128test.bin
ファイル名の一覧が表示されました。
-
ls
-
ls コマンドは、現在のディレクトリにあるファイル名、ディレクトリ名を一覧表示します。
よく使うオプションは、以下の通りです。
-l : 詳細な情報の表示
-a : 隠しファイル(先頭が . で始まるファイル名、ディレクトリ名)も表示
ここで、. は現在のディレクトリ、.. は1つ上のディレクトリを指します。
cat - ファイルの内容表示
ファイルの内容を見るには、cat 空白に続けて、ファイル名を入力して、"Enter" キーを押して下さい。
readme.txt という名前のファイルの内容をみてみましょう。
# cat readme.txt
ファイルの内容が表示されます。
-
cat ファイル名
-
cat コマンドは、続けて指定したファイルの内容を表示します。
ファイル名は、空白で区切って複数個指定でき、続けて表示されます。
cat つまり concatenate は、複数あるものを結合するという意味です。
cp - ファイルのコピー
ファイルをコピーするには、cp 空白 コピー元のファイル名 空白 コピー先のファイル名 を入力して下さい。
readme.txt という名前のファイルを a.txt という名前のファイルにコピーしてみましょう。
# cp readme.txt a.txt
ファイルの一覧を表示するとコピーしたファイルができています。
# ls
a.txt bench.py hello.c hello.js readme.txt rv128test.bin
-
cp 元のファイル名 コピー先のファイル名
-
cp コマンドは、元のファイルをコピー先のファイルにコピーします。
よく使うオプションは、以下の通りです。
-r : ディレクトリ以下もコピーします
-p : ファイルの属性もコピーします
-f : 強制的に実行します
mv - ファイルの移動(名前の変更)
ファイルを移動、つまり、名前を変更するには、mv 空白 元のファイル名 空白 移動先のファイル名 を入力して下さい。
a.txt というファイルの名前を b.txt という名前に変更してみましょう。
# mv a.txt b.txt
ファイルの一覧を表示するとファイル名が変更されています。
# ls
b.txt bench.py hello.c hello.js readme.txt rv128test.bin
-
mv 元のファイル名 移動先のファイル名
-
mv コマンドは、元のファイルを移動先のファイルに移動します。
両者が同一のディレクトリでにあると、ファイル名の変更と同じことになります。
よく使うオプションは、以下の通りです。
-f : 強制的に実行します
rm - ファイルの削除
ファイルを削除するには、rm 空白 ファイル名と入力して下さい。
b.txt という名前のファイルを削除してみましょう。
# rm b.txt
ファイルの一覧を表示すると削除されているのが分かります。
# ls
bench.py hello.c hello.js readme.txt rv128test.bin
-
rm ファイル名
-
rm コマンドは、ファイルを削除します。
よく使うオプションは、以下の通りです。
-r : ディレクトリ以下も削除します
-f : 強制的に実行します
nano - ファイルの編集
readme.txt という名前のファイルの内容を変更してみましょう。
# nano readme.txt
nano が起動し、全画面で表示されます。ワープロのように矢印キーでカーソルを移動したり、文字を入力したり、Backspace, Delete キーで文字を消すことができます。
-
nano ファイル名
-
nano コマンドは、ファイルの内容を編集します。
指定したファイルがなければ、新しく作成します。
画面の下のほうに、以下の様な簡単な操作方法が表示されます。
^G Get Help ^O Write Out ^W Where Is ^K Cut Text ^C Cur Pos ^Y Prev Page ^X Exit ^R Read File ^\ Replace ^U Uncut Text ^_ Go To Line ^V Next Page
これは、以下の様に表記します。
Ctrl + X
簡便に表記することもあります。
C-x
これをさらに省略すると以下の様になります。
^X
コントロールキーとXキーを同時に押すと、編集されてない場合は終了しますが、編集されている場合は以下の様に表示されます。
Save modified buffer? Y Yes N No ^C Cancel ここで、y または n を押します。
Y -> ファイル名の修正が可能となり、Enter を押すと編集内容を保存して終了します。
N -> 編集内容を破棄して終了します。
^C -> 編集画面に戻ります。
ディレクトリ操作
コンピュータで扱うファイルは膨大な数にになるので、ディレクトリ(Windows では、フォルダー)という単位でまとめて扱います。
ディレクトリの中にファイルやディレクトリを作ることができます。
mkdir - ディレクトリ作成
ディレクトリを作成してみましょう。
# mkdir hoge
ファイルの一覧を表示するとディレクトリ名も表示されます。
ディレクトリはファイルと異なった色で表示されることもあります。
# ls
hoge
-
mkdir ディレクトリ名
-
mkdir コマンドは、ディレクトリを作成します。
mv - ディレクトリの移動(名前の変更)
ディレクトリ名を変更してみましょう。
# mv hoge hoho
ファイルの一覧を表示すると変更が反映されているのが分かります。
# ls
hoho
-
mv 元のディレクトリ名 移動先のディレクトリ名
-
mv コマンドは、元のディレクトリを移動先のディレクトリに移動します。
両者が同一のディレクトリでにあると、ディレクトリ名の変更と同じことになります。
mv については、ファイルとディレクトリは同じように扱われます。
よく使うオプションは、以下の通りです。
-f : 強制的に実行します
rmdir - ディレクトリ削除
ディレクトリを削除してみましょう。
# rmdir hoho
ファイルの一覧を表示すると変更が反映されているのが分かります。
# ls
-
rmdir ディレクトリ名
-
rmdir コマンドは、指示したディレクトリが空の場合に、ディレクトリを削除します。
pwd - 現在のディレクトリ位置の表示
ディレクトリは、ディレクトリ内にディレクトリを作ることができ、全体で階層構造になっています。
今、ディレクトリのどこにいるのかみてみましょう。
# pwd
/root
-
pwd
-
pwd コマンドは、現在のディレクトリ位置を表示します。
ディレクトリ名の区切りには、/ が使われ、ルート(一番上)からの位置が表示されます。
cd - ディレクトリ位置の移動
ディレクトリ位置は移動することができます。
一番トップ、ルートディレクトリに移動してみましょう。
# cd /
ここで、/ は、ルートディレクトリを指しています。
移動を確認してみましょう。
# pwd
/
# ls
bin dev etc home lib media mnt opt proc root run sbin sys tmp usr var
元のディレクトリ位置、ホームディレクトリに戻ってみましょう。
cd の後に、ディレクトリ名を書かないとホームディレクトリに移動します。
# cd
# pwd
/root
一つ上のディレクトリに移動するには、.. を用います。
# cd ..
# pwd
/
ディレクトリの区切りには、/ を使います。
ルートディレクトリにある usr ディレクトリ内の bin ディレクトリに移動するには、以下の様にします。
# cd /usr/bin
# pwd
/usr/bin
-
cd ディレクトリ名
-
cd コマンドは、指示したディレクトリを現在のディレクトリにします。
コマンドラインでの操作
主なコマンドのある場所
今まで紹介した ls や cat などをコマンドといいます。
他にどのようなコマンドが使えるのでしょうか?
一般ユーザ向けには bin、管理者向けには sbin という場所にコマンドが置いてある場合が多いです。
# ls /bin
# ls /usr/bin
# ls /sbin
# ls /usr/sbin
たくさんのコマンドがありますが、全てを網羅する必要は全くありません。
コマンドオプション
コマンドは、コマンド名 + オプション + ファイル名 の形式で与える場合が多いです。
コマンドオプションなどの簡単な説明は、--help オプションを付けると表示される場合が多いです。
# ls --help
例えば、ls コマンドの場合、-l オプションをつけると "Long listing format" で表示されるとあります。
# ls -l
すると、ファイル名だけでなく、アクセス権、所有者、サイズ、作成日なども表示されます。
このように、1つのコマンドでもオプションの組み合わせでいろいろなことができるようになります。
また、man コマンドでコマンドの説明が表示されますが、ここで紹介した JSLinux では、システムを軽量化するためか表示されませんでした。
# man ls
-
man コマンド名または関数名など
-
man コマンドは、指示したコマンドや関数の説明を表示します。
コマンドの使い方の説明に、以下の様な感じで書いてあることがあります。
ls [-1aRls] [-w WIDTH] [FILE]...
この場合、[ と ] で囲ってあるところは省略可能を表します。
[-1aRls] の様ようなところは、 - の後に、1, a, R, l, s のどれか(複数でも可)のオプションを指定することを表します。
... は、複数の指定が可能、この場合は、ファイルをいくつか指定可能なことを表します。
コマンド実行の停止
例えば、以下のコマンドは、10 秒経たないと終了しません。
# sleep 10
-
sleep 数値
-
sleep コマンドは、指示した数値秒待ちます。
数値の後ろに、s を付けると秒、m を付けると分、h を付けると時、d を付けると日で数値が解釈されます。
しかし、実行中に Ctrl キーと C キーを同時に押すと、直ちに終了します。
# sleep 10
^C
コマンドの逐次実行と同時実行
コマンドを ; で区切って指定すると順に実行されます。
# sleep 5 ; sleep 5
この場合、実行に 10 秒かかります。
コマンドを && で区切って指定すると前の実行が成功すれば、後のコマンドが実行されます。
# sleep 5 && sleep 5
この場合、実行に 10 秒かかります。
コマンドを & で区切って指定すると同時に実行されます。
# sleep 5 & sleep 5
この場合、実行に 5 秒かかります。
& の前のコマンドは、バックグラウンドで実行されるので、終了すると以下の様なメッセージが表示されます。
[1]+ Done sleep 5
以下の様に入力すると、コマンドがバックグラウンドで実行され、すぐに他のコマンドを受けることができるようになります。
# sleep 5 &
ジョブ
前述したように、& をつけるとコマンドをバックグラウンドジョブとして実行できます。
# sleep 5 &
コマンドを実行中に、Ctrl + Z キーを押しても、ジョブ化できます。
# sleep 10 => 実行後 ^Z を押す
^Z[1]+ Stopped sleep 10
どのようなジョブが残っているか見るには jobs で見ます。
# jobs
[1]+ Stopped sleep 10
このジョブをフォアグラウンドで実行するには fg 、バックグラウンドで実行するには bg を入力します。
# sleep 10 => ^Zを押す
# fg
sleep 10
# sleep 10 => ^Zを押す
# bg
[1] sleep 10
#
[1]+ Done sleep 10
複数のジョブがある場合には、% + カッコ内の番号を指定します。
ジョブを停止させるには、kill を使います。
# sleep 10 &
# jobs
[1]+ Running sleep 10
# kill %1
[1]+ Terminated sleep 10
ここでの内容は、超入門という割には少し難しいと思いますが、操作中に ^Z を誤って押して慌てないためには必要です。
リダイレクト
コマンドの実行結果は画面に表示されますが、リダイレクトを利用することで、ファイルに書き出すことができます。
これは、コマンドの後に、> ファイル名 で指定します。
# ls -l
# ls -l > hoge.txt
# cat hoge.txt
また、コマンドの後に、>> ファイル名 で、以前の内容に追加して書き出します。
# ls -l >> hoge.txt
# cat hoge.txt
コマンドの後に、< ファイル名 を指定することで、入力する内容をファイルで与えることができます。
例えば、ソートコマンドに先ほどの入力を与えると、結果がソートされて出力されます。
# sort < hoge.txt
-
sort
-
sort コマンドは、与えられた文字列を行ごと順番に並び替えて表示します。
例えば、sort Enter と入力し、c Enter, b Enter, a Enter, Ctrl+d と入力すると、a, b, c と出力されます。
# sort c => c Enter b => b Enter a => a Enter => Ctrl + d a <= 順に並び替えられて表示されます b c
キーボードから入力した場合、入力の終了は、Ctrl + d を入力します。
パイプ | を使えば、ファイルを経由せずに、他のコマンドの出力を入力とすることができます。
# ls -l | sort
これにより、コマンドを組み合わせて処理することができ、利用範囲が大幅に広がります。
入力補助
コマンド入力で、カーソルキーの上下を押すと、今まで実行したコマンドの履歴が出てきます。
また、入力途中で Tab キーを押すと残りの入力を補助してくれたり、二回押せば候補を表示してくれたりします。
# so"Tab"re"Tab" => # sort readme.txt
これは、説明より慣れてもらった方がよいです。
特に使わなくても大丈夫です。
変数
コマンドラインの環境でも、変数が使えます。
変数などの環境を含め、CUIは、シェルプログラム(sh)が行います。
変数には、シャル内でのみ有効なシェル変数と子シェル内でも有効な環境変数があります。
変数を参照するときは、先頭に $ 記号を付けます。
# hoge1=hogehoge
# export hoge2=hogehogehoge
# echo $hoge1
hogehoge
# echo $hoge2
hogehogehoge
# sh <= 新たなシェルを起動します
# echo $hoge1
<= 子のシェルではシェル変数は引き継がれません
# echo $hoge2
hogehogehoge
# exit <= 元のシェルに戻ります
# echo $hoge1
hogehoge
# echo $hoge2
hogehogehoge
-
シェル変数=値
-
シェル内でのみ有効なシェル変数に値を設定します。
-
unset シェル変数
-
設定したシェル変数を削除します。
-
set
-
シェル変数の一覧を表示します。
-
export 環境変数=値
-
子プロセスでも有効な環境変数に値を設定します。
-
printenv
-
環境変数の一覧を表示します。
-
echo 文字列や変数
-
echo コマンドは、与えられた文字列や変数の値を表示します。
-
sh
-
sh コマンドは、新たなシェルを起動します。
-
exit
-
exit コマンドは、シェルを終了します。
コマンドパス
先ほど、コマンドはいろいろな場所(ディレクトリ)に置かれていると書きましたが、実際に動作するコマンドは、どこに置かれていて、どのプログラムが動作するのでしょうか?
シェルは、環境変数 PATH に書かれたディレクトリ順に入力されたコマンドを検索して、見つかったらそれを実行します。
これをコマンドパスと言って、以下の様にして表示できます。
# echo $PATH
/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin
which コマンドで、実行されるコマンドのパスが表示できます。
# which ls
/bin/ls
-
which コマンド
-
実行されるコマンドのパスを表示します。
また、alias によって、入力コマンドを置き換えることができます。
# alias ll='ls -al'
# ll
(ls -al と同様の結果が表示されます)
-
alias コマンド='コマンドの置換'
-
コマンドを置き換えることができます。
alias のみの実行で、置き換えられるコマンドを一覧を表示します。
その他
その他、いろいろな約束事があります。
例えば、~ はホームディレクトリを表し、* はカレントディレクトリ(今いるディレクトリ)のファイルとディレクトリを表します。
# echo ~
# echo *
空白は、' ' または、" " で括って表現します。
# echo 'This is a pen.'
# echo "This isn't a pen."
などなど、他にもいろいろあります。
プログラムの作成と実行
プログラムの作成
簡単な C 言語によるプログラムを作成してみましょう。
以下の様に、エディタでソースプログラムのファイルを作成します。
# nano hello.c
ファイルの内容は、以下のようにします。
#include <stdio.h>
void main() {
printf("hello\n");
}
プログラムのコンパイル
作成したソースプログラムをコンパイルして、実行可能なバイナリファイルを作成します。
# gcc hello.c
-
gcc ソースファイル名
-
gcc コマンドは、ソースプログラムをコンパイル・リンクし、実行可能なバイナリファイルを作成します。
ここで、hello.c がソースプログラム、a.out がバイナリファイルです。
# ls
a.out hello.c
プログラムの実行
バイナリファイルを実行すると、hello という文字が出力されます。
# ./a.out
hello
更にステップアップ
上述したコマンド以外に、以下のコマンドが利用できるとよいと思います。
-
id [ユーザ名]
-
ユーザがどんなグループに属しているかの情報が表示されます。
/etc/passwd ファイルにどのようなユーザが存在するかが書かれています。
-
chmod モード ファイル
-
ファイルの属性(読み書き実行権)を変更します。
-
chown 所有者:グループ ファイル
-
ファイルの所有者やグループを変更します。
-
sudo コマンド
-
管理者権限でコマンドを実行します。
-
df -h
-
ディスクの空き容量が表示されます。
-
find . -name ファイル -print
-
現在のディレクトリ以下を検索し、ファイルのありかを表示します。
-
grep キーワード *
-
現在のディレクトリにあるファイルを検索し、キーワードを探します。
-
ps -elf
-
ホスト計算機で動作しているプロセスを表示します。
-
top
-
現在のプロセスを負荷の高い順に表示します。
終了するには、q キーを押します。
-
kill プロセスID
-
プロセスを強制終了します。
-
vi
-
テキストエディタです。
Linux システムであればまず入っているので、一通り操作方法を覚えておくと便利です。
終了するには、ESC, Z, Z を入力します。
~/.vimrc ファイルに以下の様に設定すると、タブが4桁毎になり、ペースト時の崩れが少なくなります。
set tabstop=4
set shiftwidth=4
set paste