今回の実習でUnixの基本コマンドの使い方については最後となる.
次回から2回は"Python"というプログラミング言語を使ってプログラミングの基礎の基礎を学習する.
なお,第7回の実技テストは,今回の内容までを対象とする.( Pythonは含まない )
ファイルやディレクトリの操作,nanoエディタなどについてしっかりと復習するとともに, 手早く操作ができるように練習しておくこと( 例年,時間が足りないという人が多い ).
諸君に求められているスキルは「速さ」と「正確さ」である. 時間内に指示内容を理解し,的確に素早く操作できることが,本当の意味で習得できたことになる.
さて,今回はUnixの標準入出力とフィルタコマンドについて学習する. どちらもUnixだけでなく,OSのしくみに関連した重要なものなので,しっかりと理解しておく必要がある.
課題に入る前に,日本語環境について触れておこう.
Unixは元々アメリカで開発されたものだ. したがってコマンドやメッセージはすべて英語である.
が,Unixが世界に広がっていくに伴い,数多くの言語に対応するようになった. この国別言語の設定を「ロケール( locale )」と呼ぶ.例えば,
WSLのUbuntuもMacOSも,初めに起動したままだと英語表記だ. エラー表示や,今回で学ぶman page( Unixのコマンドマニュアル )など,様々な情報が英語で表示される.
これでは英語に慣れていない人には流石に辛い. ここでは日本語ロケールに適応したシステム表示とman pageを設定したい.
ただし,以下の手続きは少し複雑なので,やれそうにない場合は,無理して日本語にする必要はない. 英語のman pageは中学程度の英語なので,単語さえわかれば十分読めるはずだ. また,日本語のman pageを持っていないコマンドやアプリケーションもあるので,すべてが日本語になるわけではない.
以下,WSL-UbuntuとMacOSに分けて説明する.
以下の記事にわかりやすく書いてある.
※上記に書いてある手順を再掲する.
$ sudo apt update▼
$ sudo apt -y install language-pack-ja
$ sudo update-locale LANG=ja_JP.UTF8
$ sudo dpkg-reconfigure tzdata
$ sudo apt -y install manpages-ja manpages-ja-dev
コマンドのインストールには"sudo apt"を使う. この"sudo"は一時的にrootになりすますコマンドで,sudo以下のコマンドを,root権限で実行する. この際,セキリュティ上,自分のパスワードの入力を促される.
パスワードがうまく通ららない,忘れた,などが生じると,パスワードを変更したくなる. が,痩せても枯れてもUnixはマルチユーザを管理するためのOSなので,簡単ではない.
以下に手順をまとめたので,参考にされたい.
以上の手順が済んだら,実際にman pageを開いてみよう.
$ man ls▼などなど.
$ man man▼
$ man cp▼
MacOSの場合は多少ややこしい.手順だけ抜き出すと以下のようになる.
詳細は,以下のリンクを読んでその通りにやればよい.
※この手順では何箇所か,ややこしいところがでてくる.(上のリンクと照合しつつ読むこと)
テキスト第10章( p.151~p.160 )を読み,書いてあることを実際に確かめながら 学習しなさい. ここにでてくるコマンド( find, grep, less, man等 )は,Unixにおいて頻繁に使う便利なものである.
特に,必ず使えるようになっておくべきなのがmanコマンドである.
Unixには,コマンドの使い方が書いた( マニュアル )があり, そのマニュアルを呼び出して画面に提示するコマンドが, "man" コマンドである.
manコマンドで呼び出されるマニュアルを "man page"( マンページ )と呼ぶ. Unix標準コマンドはもちろん,後からインストールするコマンドやアプリケーションのほとんどには, man pageが登録されている.
たとえば,"ls"コマンドの man pageを見るには,次のようにする.
$ man ls
これでマニュアルが端末に表示される. マニュアルは文字のみで,イラストや画面などはない ( テキスト端末だから当然だが ).
上記のとおり入力して実際に表示させてみよう. 非常に多くの情報が表示されるが,よく眺めれば, その中から自分に必要な情報を見つけ出せる. たとえば,lsコマンドに"-R"オプションをつければどうなるか,調べよう.
なお,"man" コマンド自身もUnix標準コマンドなので,当然man pageを持っている. オプションをうまく使うと,コマンド名がわからなくても, ある機能をもつコマンドを検索したりすることが可能である.
$ man man
実習室で利用しているUbuntu Linuxには, Web上にもman pageとほぼ同じマニュアルが存在する.
Ubuntuページは残念ながらぼぼ英語オンリーだが, man pageの英語はさほど難しい英語ではない. 必要なところを端折って読めばいい. コマンドの使い方,オプションくらいは理解できるはずだ.
下のJM ProjectはLinux全般の日本語プロジェクトで,日本語マニュアルも作成してある. ただし,Ubuntuのみへの対応ではないので,一つのコマンドに複数のマニュアルが存在する場合もある. 臨機応変に対応すること.
テキストの第7章「標準入出力を理解する」-- 7-1節「標準入出力・リダイレクション・パイプ」( p.101~p.109 )を読み, テキスト中の例題を実際に入力し,順に確かめなさい.
上記パイプ機能を活用するとさまざまなことができるが, 特に便利なのは「フィルタ」コマンドである. 以下のオンラインテキストを読み,ターミナルで実際に操作・実行しなさい.
【フィルタコマンドの使い方】
上記テストにも出てきた主要なフィルタコマンドは,様々な用途に使われる. それぞれの用途のためにコマンドの動作を変更したり,機能を追加したりするオプションが, 数多く用意されている. 以下に,sort , head , tail , grepの主要なオプション表を提示しておくので,適宜参照すること.
![]() |
![]() |
<headのオプション> | <tailのオプション> |
![]() |
![]() |
<sortのオプション> | <grepのオプション> |
◆上記の表は以下のサイトを参照させて頂いた. Unixのコマンドについてわかりやすく記述してあるので,man page代わりに参照してもよいだろう.
Unixコマンドについては今回で終了である. 今まで学んできたUnixコマンドについて,まとめた文書を示しておく. よく読んで,後の実技テストに備えること.
※注意※:これらは暗記しても意味はない. 実際に何度もターミナルから入力して,どういう結果になるのかを目と指に覚えさせるつもりで, しつこく使うようにすれば,だんだん慣れてくる.
UnixをはじめWindowsやMacOSといった多機能なOSには,「シェル」と「カーネル」という概念がある. カーネルはOS( オペレーティングシステム )の中核をなすプログラムだ. その機能を活用するにはそれなりのシステムの知識が必要である.
シェルはそういう知識や技術がなくとも,一般ユーザにとってわかりやすい「コマンド」を受け付けて, それをカーネルに渡す役割を担う. システムにとってはシェルそのものが「ユーザーインタフェース」だと言える.
本実習で利用しているUbuntuの「端末」で,様々なコマンドを入力してきたが, それはすべてシェルを介している.
※確認( ターミナルで )※
$ ps PID TTY TIME CMD 8 tty1 00:00:00 bash 26 tty1 00:00:00 ps $ |
Windowsとちがって,Unixではこのシェルを切り替えて利用できる. ここでは,デフォルト( 初期状態 )のログインシェルである,bash について学ぶことにする.
テキストの第9章「シェルを理解する」( p.127~p.147 )のうち,
を読んで,テキスト中の例題を実際に入力し,順に確かめよう.
シェル「bash」には, もともとのsh(Bシェル)にはない高度な機能が数多くある. 第3回で紹介した履歴(history)機能はその一つである.
テキストには書いていないが,ここでは多くの機能の中から, 「これを利用すれば格段に作業効率がよくなる」 機能を紹介する.
履歴機能の他にもコマンド入力で極めて強力な助っ人機能として, シェルの便利機能がある.
すでに第3回で紹介したので使いこなしている人もいるかと思うが,再度紹介しておく.
ヒストリ機能の利用法の例:
上矢印キー ← 直前のコマンドを復元( どんどんさかのぼる )
下矢印キー ← さかのぼり過ぎた履歴を進める
!!( 半角ビックリ×2 ) ← 上矢印キーと同じ
history ← 過去にその端末で入力した履歴リストを表示
![過去のコマンド頭文字] ← 履歴から頭文字を検索してその行を実行
( ex: nano hogehoge.txt などの後に,!na で同じことを実行 )
![数字] ← historyで表示した履歴番号のコマンドを実行
矢印キーの履歴機能は手軽だが,いつになったら目的の行に到達するかがわからない. 直前の履歴ならまだしも,いつ入力したのか不明な場合は賢いやり方とは言えない.
以下に参考リンクを紹介しておく(第3回で既出のものも含める)
★historyのカスタマイズ方法:
Unixはファイル名にあまり制限がない.半角空白は使えないが, ものすごく長い名前のファィル名や,長い拡張子も認識される. しかしそういう長い名前やややこしい名前のファイルを指定するのは, 手間だし間違えるかもしれない.
そういう人のために,シェルは,ファイル名を補完してくれる.
Tabキー ← ファイル名で頭の1,2文字を入れてからTABを押すと, その文字で始まるファイルがあれば,残りのファイル名を 代わりに入力してくれる.
たとえば,カレントディレクトリにファィル
aaaaaaaaaaa.txt abcdeeee.txt bbbbbbbb.txt
が存在したとする.以下に補完機能がどう働くかを見よう.
<bbbbbbbb.txtを指定したい> $ ls b[TAB] ⇒ すぐbbbbbbbb.txt と補完表示 $ ls bbbb.txt bbbb.txt $ <aaaaaaaaaaa.txtを指定したい> $ ls a[TAB] ⇒ aで始まるファイルは複数あるからTAB 1回では表示しない $ ls a[TAB][TAB] ⇒ もう一度TABを押すと, aaaa.txt abcd.txt ⇒aで始まるリストが表示される $ ls a ⇒ 入力待ち状態になるので,aを追加してTAB $ ls aa[TAB] ⇒ すぐaaaaaaaaaaa.txtと補完表示 $ ls aaaaaaaaaaa.txt ※( 上の3行は実際には1行 ) aaaaaaaaaaa.txt $ <( 応用 )unitsコマンドを実行したいがuniなんとかしか覚えてない> $ uni[TAB][TAB] ⇒ TAB 2回でuniから始まるコマンドを検索 unifdef unifdefall uniq units $ uni ⇒ 入力待ち状態になるので,tを追加してTAB $ unit[TAB] ⇒ すぐに tsを補完 $ units ※( 上の3行は実際には1行 ) ( 以下略 ) |
cdコマンドでカレントディレクトリをいろんな場所に移動することを学んだ. しかし, 「ちょっとだけ移動して,すぐに今のディレクトリに帰ってきたい」 ということがよくある.こういう時に便利なシェルコマンドがある.
pushd [Dir] ← 一時的にDirに移動する popd ← 一時的な場所から戻る dirs ← 一時移動を何回しているかを表示する
pushd/popdを使った例を見てみよう.
<ホームディレクトリにいます> $ pwd ⇒ いまのディレクトリを確認 /usr/home/t00999 $ pushd /tmp ⇒ /tmpに一時移動するぞ /tmp ~ ⇒ 左端が今いる場所が表示される.右側は元の場所 $ pwd ⇒ 確認すると…… /tmp ⇒ たしかに/tmp $ ls ⇒ なにか作業をする ( 中略 ) $ popd ⇒ 前のディレクトリに戻るぞ ~ ⇒ どこに戻ったかという表示 $ pwd ⇒ 確認する /usr/home/t00999 ⇒ 確かに戻っている $ |
このpushdは 後入れ先出しスタック として働くので, 多重に移動することができる. しかし,あまり多重にpushdで移動すると,もともとどこにいたのかわからなくなる. そういう時には dirs コマンドを使うが,多重移動は基本的にはお勧めできない.
Unixのコマンドにはたくさんのオプションがある. 覚えるのはよく使うものでよいのだが, それでもオプション付きでしょっちゅう使う場合は,やはり入力が面倒である.
そういう時は,オプションごとパックにして, 新しいコマンドのように登録してしまえると便利だ. これを実現するのが,「エイリアス( 別名 )機能」だ.
alias [新コマンド] ="[登録コマンド行]" ← 1行で入力できるすべてを新コマンドで置き換える unalias [新コマンド] ← 別名定義したのを解除
※登録したいコマンド行の表記をダブルクォートで囲むのがミソだ. 気に入ったaliasは,"$HOME/.bashrc"の一番最後に, 上の形式で書き込んでおくといい.次から自動で利用できるようになる.
ひとつのコマンドにオプションを追加したり,長い1行コマンドを短く読み替えたり,使い道はいろいろだ.利用例をあげておく.
<ls を -F( ファイルの種別表示 )オプション付きで定義> $ alias ls="ls -F" $ ls ⇒ 確かめてみる Bakup/ Report/ Work/ exec.sh* fileA.txt ⇒ ファイル名の最後が / → ディレクトリ,* → 実行属性 $ unalias ls ⇒ ls の別名解除 $ ls ⇒ 確かめてみる Bakup Report Work exec.sh fileA.txt ⇒ ファイル名の最後にはなにもつかない $ <便利なalias集> $ alias ll="ls -la" ⇒ 詳細ファイルリストをllで $ alias cpr="cp -Rp" ⇒ ディレクトリごとコピーをcprで $ alias g="grep" ⇒ grepを g 1文字で $ alias cll="clear;ls" ⇒ 画面をクリアしてls <長いコマンドでも短縮登録> $ dmt ⇒ dmtというコマンドはあるか? bash: dmt: command not found ⇒ そんなもんはない! $ alias dmt="dmesg|tail -n 30|less" ⇒ どういうことかやってみて!( lessは行数の多いファイルを読むリーダー ) $ dmt ( ズラズラズラっとシステム情報が!!"q"と押すとlessから抜けられる ) $ |
※その他,「bash alias」でWeb検索すれば実用例がたくさん出てくる.
ここではnanoから一歩踏み込んで,シンプルだが高機能なエディタvi( VIM )を紹介する.
現在,多くのLinuxでは標準エディタとしてnanoがデフォルトになっている. しかし,Unixはもともと標準エディタとして"vi"を装備していた.
viは1960年代に作られた非常に古いソフトだが,今手も進化を続け, WindowsにもMacにもAndroidにも移植されている. プログラマやシステムエンジニアをはじめ, 多くの愛用者がおり,プロのライターにも一定の人気がある.
Unix系のエディタとして後発の"Emacs"とは長年のライバルで, 愛好家の間では「どちらが優れているのか」という一種の宗教論争にまでなっている.
viを知っておけば,サーバ管理,プログラミング,Webライティング,論文執筆等, 機能性を生かして様々な用途に利用することが可能だ.
viエディタは,はじめは少しとっつきにくい面もあるが,慣れてしまうと
という,とてもすぐれたエディタである. ――プログラムや論文など,文字を打鍵することが圧倒的に多い職業の人間にとって, キーボードから指を離さずに操作を続けられることは,生産性を維持するのに極めて重要なことだ.
まず,viの基本的な使い方を学習しよう.教科書で簡潔にまとめられている. 教科書の 8-1 節「viエディタを使う」(p.117~p.122) を読んで,教科書中の例題を実際に入力し,順に確かめていこう. (8-2 節以降は今回の範囲外)
※カーソルの移動には,矢印キーを使わず,jklhを使う.
その方が圧倒的に操作が早くなる.
次に,viエディタについて,もう少し詳しく学習する. じつはvimはチュートリアルを内蔵しており,次のコマンドでvimを使ったトレーニングが始まる.
$ vimtutor ja▼
これに沿って丁寧に,何度もトレーニングすれば,すぐにviの操作になれるだろう.
[ページトップへ]
2020-07-02 by Kobori Satoshi, Fujii Daisuke