103.1 レッスン 1
Certificate: |
LPIC-1 |
---|---|
Version: |
5.0 |
Topic: |
103 GNUおよびUnixコマンド |
Objective: |
103.1 コマンドラインでの作業 |
Lesson: |
1 of 2 |
はじめに
Linux管理やBashシェルを触り始めたばかりの人は、GUIインターフェースの快適さがないと不安を感じてしまうことがよくあります。彼らは、グラフィカルなファイルマネージャで利用できる視覚的な手がかりと、コンテキスト情報に右クリックでアクセスすることに慣れています。そのため、まずは比較的少数のコマンドラインツールをマスターし、これまでにGUIで操作していたのと同じように、すべてのデータを操作できるようになることが重要です。
システム情報の取得
コマンドラインプロンプト上に点滅するカーソルを見つめながら、最初の質問はおそらく “私はどこ?” でしょう。より正確には、“Linuxファイルシステムのどこにいて、新しいファイルを作った場合、それはどこに置かれるのか?” ということでしょう。ここで求めているのは、自分の 現在の作業ディレクトリ であり、pwd
コマンドがそれを教えてくれます。
$ pwd /home/frank
Frankがシステムにログインしていて、ホームディレクトリ /home/frank/
にいるとしましょう。彼がファイルシステム内の他の場所を指定せずに touch
コマンドを使用して空のファイルを作成した場合、ファイルは /home/frank/
ディレクトリに作成されます。ls
を使用してディレクトリの内容を一覧表示すると、作成した新しいファイルが表示されます。
$ touch newfile $ ls newfile
ファイルシステム内の場所だけではなく、実行しているLinuxシステムに関する情報が必要になることがよくあります。例えば、ディストリビューションの正確なリリース番号や、ロードされているLinuxカーネルのバージョンなどです。uname
ツールを使用してそれら確認することができますが、-a
(“all”)オプションを指定することが重要です。
$ uname -a Linux base 4.18.0-18-generic #19~18.04.1-Ubuntu SMP Fri Apr 5 10:22:13 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
この例で uname
は、FrankのマシンにLinuxカーネルバージョン4.18.0がインストールされており、64ビット(x86_64
)CPUでUbuntu18.04を実行していることを示しています。
コマンドについて調べる
未知のLinuxのコマンドについて書かれた文書に出くわすことがあります。コマンドが何をするもので、どうすれば効果的に使用できるのかといった、あらゆる種類の役立つ情報を、コマンドライン自体が教えてくれます。おそらく有用な情報のほとんどは、man
(訳注: manはMANualの短縮形です)システム内のファイルで見つかるでしょう。
Linux開発者は原則として、作成したユーティリティと一緒に man
ファイルを配布します。man
ファイルはきちんと構造化された文書で、内容を直感的に理解できるように、標準化されたセクション見出しで内容が掴みやすくなっています。man
に続けてコマンド名を入力すると、コマンド名、使い方の概要、詳細な説明、歴史やライセンスなどの重要な情報が表示されます。以下に例を示します。(訳注: 日本語環境では、日本語に翻訳されたmanpページがインストールされていれば、日本語版が表示されます。ただし、翻訳版はバージョンが古いことが少なくありません。)
$ man uname UNAME(1) User Commands UNAME(1) NAME uname - print system information SYNOPSIS uname [OPTION]... DESCRIPTION Print certain system information. With no OPTION, same as -s. -a, --all print all information, in the following order, except omit -p and -i if unknown: -s, --kernel-name print the kernel name -n, --nodename print the network node hostname -r, --kernel-release print the kernel release -v, --kernel-version print the kernel version -m, --machine print the machine hardware name -p, --processor print the processor type (non-portable) -i, --hardware-platform print the hardware platform (non-portable) -o, --operating-system print the operating system --help display this help and exit --version output version information and exit AUTHOR Written by David MacKenzie. REPORTING BUGS GNU coreutils online help: <http://www.gnu.org/software/coreutils/> Report uname translation bugs to <http://translationproject.org/team/> COPYRIGHT Copyright©2017 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. SEE ALSO arch(1), uname(2) Full documentation at: <http://www.gnu.org/software/coreutils/uname> or available locally via: info '(coreutils) uname invocation' GNU coreutils 8.28 January 2018 UNAME(1)
man
には、正確なコマンド名を指定します。探したいコマンドの正確な名前がわからない場合は、apropos
コマンドを使用して、man
ページ内の「名前」と「概要」を検索できます。たとえば、uname
がLinuxカーネルのバージョンを表示することを思い出せない時には、kernel
という単語を apropros
に渡して検索します。おそらく多くの行が表示されますが、目的のものも含まれているはずです。
$ apropos kernel systemd-udevd-kernel.socket (8) - Device event managing daemon uname (2) - get name and information about current kernel urandom (4) - kernel random number source devices
コマンドの完全なドキュメントが必要ない場合は、type
を使用してコマンドの種類をすばやく調べられます。以下の例では type
を使用して、一度に4つのコマンドを調べています。結果は、cp
(“copy”)が /bin/cp
というプログラムであり、kill
(実行中のプロセスの状態を変更する)が組み込みコマンドであること(Bashの一部であること)を示しています。
$ type uname cp kill which uname is hashed (/bin/uname) cp is /bin/cp kill is a shell builtin which is /usr/bin/which
uname
が “hashed” と表示されていますが、これはコマンド種別ではなく、シェルが次の実行に備えてハッシュテーブルと呼ばれる一種の辞書にコマンドを記録したことを示しています。ハッシュされたコマンドは、呼び出されたときに素早く実行されます。Frankがログインした直後に type uname
を実行すれば、cp
や which
と同様に、uname
がファイルに収められたプログラムであることが表示されることでしょう。
Note
|
ログインし直さなくても、コマンド |
スクリプトを作成している場合などには、コマンドのパス名のみを知りたいことがよくあります。type
の実行例で示した which
コマンドは、コマンドの絶対パスのみを返します。次の例では、uname
コマンドと which
コマンドの両方を検索しています。
$ which uname which /bin/uname /usr/bin/which
Note
|
“組み込み” コマンドに関する情報を表示したい場合は、( |
コマンド履歴の利用
あるコマンドの正しい使い方を慎重に調べ、複雑なオプションや引数をうまく組み合わせて実行することは、よくあることです。しかし、数週間後に同じオプションと引数を使用して同じコマンドを実行したい時に、詳細を思い出せない場合はどうしたらよいでしょうか? 最初から調べ直すのではなく、history
を使用して、以前に使用したコマンドを再利用ほうが簡単です。
history
と入力すると、過去に実行したコマンドのリストが返され、末尾には直前に実行したコマンドが表示されます。grep
コマンドにパイプして、探したい文字列を指定することで、以前実行したコマンドを簡単に検索できます。この例では、テキスト bash_history
を含むコマンドを検索します。
$ history | grep bash_history 1605 sudo find /home -name ".bash_history" | xargs grep sudo
この実行例では、シーケンス番号1605と、1つのコマンドが返されています。
なお .bash_history
は、ユーザーのホームディレクトリ内に存在する隠しファイルの名前です。これは隠しファイル(ファイル名の前のドットが付いている)であるため、 ls
に -a
オプションを指定してディレクトリの内容を一覧表示した場合にのみ表示されます。
$ ls /home/frank newfile $ ls -a /home/frank . .. .bash_history .bash_logout .bashrc .profile .ssh newfile
.bash_history
ファイルには何が含まれているでしょうか? 自分の目で確かめれば、最近のコマンドが何百も表示されるでしょう。ただし、直近に実行した ほとんどの コマンドが欠落していることに気付くかもしれません。コマンドを実行するとすぐに、動的な history
データベースに追加されますが、セッションを終了するまで .bash_history
ファイルに書き込まれません。
キーボードの上下の矢印キー(ないしは Ctrl+P と Ctrl+N )を使用すると、history
の内容を活用して、コマンドラインの実行履歴を高速かつ効率的に確認できます。上矢印キー(Ctrl+P)を何度か押すと、コマンドラインに最近のコマンドが現われます。もう一度実行したいものに到達したら、Enterキーを押して実行できます。これにより、シェルセッション中にコマンドを何度も呼び出したり、必要に応じてコマンドラインを変更したりすることが簡単になります。
演習
-
man
コマンドを使って、apropos
に簡単な使用方法を表示させるオプションを調べてみましょう。 -
man
コマンドを使って、grep
コマンドの著作権を調べてみましょう。
発展演習
-
利用中のシステムのハードウェアアーキテクチャーと、Linuxカーネルのバージョンを表示してみましょう。
-
動的な
history
データベースと.bash_history
ファイルの最後の20行をそれぞれ表示して、それらを比べてみましょう。 -
apropos
コマンドを使って、接続されている物理ブロックデバイスのサイズを調べるコマンドを探し、そのman
ページを参照してメガバイトやギガバイトではなくバイト単位でサイズを表示するコマンドとオプションを見つけてください。
まとめ
このレッスンでは、次のことを学びました。
-
自分がいるファイルシステムの位置や、OSに関する情報を取得する方法。
-
コマンドの使用法に関するマニュアルを見つける方法。
-
コマンドのファイルシステム上の位置と、種類を確認する方法。
-
以前に実行したコマンドを見つけて再利用する方法。
このレッスンでは、次のコマンドを説明しました:
pwd
-
現在の作業ディレクトリのパスを出力します。
uname
-
システムのハードウェアアーキテクチャ、Linuxカーネルのバージョン、ディストリビューション、およびディストリビューションリリースを出力します。
man
-
コマンドの使用法を文書化したヘルプファイルにアクセスします。
type
-
コマンドのファイルシステム上の位置や種類を出力します。
which
-
コマンドのファイルシステム上の位置を出力します。
history
-
以前に実行したコマンドを表示または操作します。
演習の解答
-
man
コマンドを使って、apropos
に簡単な使用方法を表示させるオプションを調べてみましょう。man apropos
を実行し、“Options” セクションの--usage
までスクロールします。 -
man
コマンドを使って、grep
コマンドの著作権を調べてみましょう。man grep
を実行し、ドキュメントの “Copyright” セクションまでスクロールします。このプログラムはフリーソフトウェアファウンデーションが著作権者であり、そのライセンス(GPL)を使用しています。
発展演習の解答
-
利用中のシステムのハードウェアアーキテクチャーと、Linuxカーネルのバージョンを表示してみましょう。
man uname
を実行して “Description” セクションを読むと、必要な結果のみを表示するオプションが分かります。-v
がカーネルバージョンを、-i
がハードウェアアーキテクチャを表示します。$ man uname $ uname -v $ uname -i
-
動的な
history
データベースと.bash_history
ファイルの最後の20行をそれぞれ表示して、それらを比較してください。$ history 20 $ tail -n 20 .bash_history
-
apropos
コマンドを使って、接続されている物理ブロックデバイスのサイズを調べるコマンドを探し、そのman
ページを参照してメガバイトやギガバイトではなくバイト単位でサイズを表示するコマンドとオプションを見つけてください。ひとつの方法として、
apropos
にblock
を指定して実行し、結果を見ていきます。lsblk
がブロックデバイスをリストするコマンド(第8章の管理者コマンド)ですから、多分、これが探しているものだと分かります。man lsblk
を実行して “Description” セクションを見ると、-b
がデバイスサイズをバイト単位で表示することが分かります。lsblk -b
を実行して、結果を確認しましょう$ apropos block $ man lsblk $ lsblk -b