はじめに|なぜLinuxを学ぶのか
Linuxについて、みなさんはどのくらいのことをご存知でしょうか?
はじめて耳にした方は少ないかもしれません。
名前を聞いたことはある方。
詳しくは知らないけれど、これから勉強しなければいけないと思っている方。
もしくは職務上やむを得ず学習をしなければならなくなってしまった方、などなど。
この記事はそうした、いわゆる「初学者」のあなたへ向けた記事となっています。
Linuxは奥が深く、Linuxについて書かれた専門書1冊だけでも結構なボリュームがあります。また、難易度の高い専門書は「Linux以前」の前提知識、つまり「そもそもLinuxとは何なのか」という基礎知識の説明を省いているものもあるようです。
この記事はそうした「これから専門書を買って勉強しようと思っているけど、その前にまずは軽くネットで調べてみよう」と思って検索をかけてくださった方が事前に読んでおくと、Linuxの学習にスムーズに移ることができるように意識をして書いたものです。
Linuxは一度習得してしまえば長く使うことのできる、ある意味お得な分野です。そしてその根底知識は、プログラミング学習を進めるうえでもとても重要かつ共通した知識です。
いわば「Linux入門書の入門記事」として、本記事をお役立ていただけたら幸いです。
では早速「Linuxを知る上での前提知識」から学んでいくことにしましょう。
Linuxを知る上での前提知識
Linuxについて説明をするにあたり、前提として必要な知識である基本ソフトと応用ソフトの考え方をまずは学習します。
みなさんがお使いになられているお手もとのコンピュータは、大きく2つの部分に分けられます。
それはハードウェアとソフトウェアです。
ハードウェアは、コンピュータでいえばコンピュータの機械そのもののこと、ゲーム機でしたらゲーム機本体のことを指します。つまり、物理的に手で触れて操作できる物体、機械のことです。
またソフトウェアとは、コンピュータなどのハードウェアで動くプログラムやアプリケーションのことを指しています。
コンピュータ本体だけがあっても、その中身にソフトウェアがなければただの画面とキーボードがついた機械ですし、ゲームの場合はゲームのソフトがなければゲームのプレイはできませんよね。
ハードウェアは私たちユーザーが目的を叶える手段ではありますが、ソフトウェアがなければ、私たちの目的、つまり「コンピュータを使って調べ物をしたい」だとか、「ゲームをして楽しい時間を過ごしたい」という目的を叶えることはできないのです。
そしてこのソフトウェアにも、大きく分けると種類が2種類あります。
それは基本ソフトウェアと応用ソフトウェアです。
基本ソフトウェア(またはシステムソフトウェア)とは主にオペレーティングシステム(OS・Operating System)のことを指しています。
代表的なものは以下のとおりです。
- Microsoft Windows:マイクロソフト社が開発・販売をしているOSです。一般向けのOSのシェアのほとんどを占めています。
- macOS:Apple社が開発・販売しているMacコンピュータ専用のOSです。
- Linux:オープンソースのオペレーティングシステムで、様々なディストリビューション(Ubuntu、Fedora、Debianなど)が存在します。個人用途やサーバー、組み込みシステムなど、さまざまなプラットフォームで使用されています。
- Android:Googleが開発したモバイルデバイス用のOSです。スマートフォンやタブレットなどの多くのデバイスで使用されています。
- iOS:Apple社が開発したモバイルデバイス用のOSで、iPhoneやiPadなどのAppleデバイスで利用されています。
また、応用ソフトウェア(またはアプリケーションソフトウェア)とは、ユーザーが特定のタスクを実行するために使用するソフトウェアのことです。応用ソフトウェアは、特定の目的やニーズに合わせて開発され、便利な機能やツールを提供しています。
ここでも代表的な応用ソフトウェアの例を、以下に挙げておきますね。
- ウェブブラウザ:パソコンやスマートフォンなどを利用し、ウェブサイトの閲覧やオンライン活動をするためのソフトウェアです。主なウェブブラウザとして、Google Chrome、Safari、Internet Explorer などが挙げられます。
- 電子メールクライアント:電子メールの送受信や管理をするためのアプリケーションソフトウェア。一般的にメールソフトなどとも呼ばれます。
- ワープロソフトや表計算ソフト:文章や表の作成・編集・管理を行うことができるアプリケーションソフトウェアです。
- メディアプレーヤー:音楽や動画の再生を行うためのソフトウェアです。
こうして具体例をみてみると、みなさんにも馴染みのあるソフトウェアのことを指しているとご理解いただけるのではないでしょうか。
なお、英語の「アプリケーション(application)」を日本語に訳すと「応用」という意味になります。そのため、「アプリケーションソフトウェア」と「応用ソフトウェア」は同じ意味の言葉です。
よくスマートフォンなどに入っている便利なソフトウェアを「アプリ」などと呼びますが、これも「アプリケーションソフトウェア」を略したものが定着した呼び名です。
言葉の意味がおおよそ掴めたところで、次はOS(Operating System)とカーネルについての説明に移っていきます。
OSはコンピュータ全体の動きを管理したり、制御したりしています。コンピュータの操作や運用、運転などを広く司るシステムのソフトウェアです。
OSの仕事はコンピュータ全体に及ぶため、なにせ色々な仕事が山のようにあります。
その多忙なOSのなかでも、特に重要な役割を担っているのがカーネルです。
カーネルはアプリケーションソフトウェアとハードウェアの架け橋のような役割を果たしています。
具体的にはシステムのリソース(資源)管理や、ハードウェアとソフトウェアの連携を管理しています。また、通信の制御を行うのもカーネルの役割です。
システムのリソース管理と聞くといまいちピンと来ないかもしれませんね。
もう少し詳しく説明をすると、みなさんがお使いのコンピュータのなかにはCPU(中央処理装置)やメモリ(記憶装置)などが入っています。
このCPU、つまり中央処理装置は、コンピュータ内の他の装置や回路の制御や、名前の通りデータの計算処理などを行っています。
またメモリ(記憶装置)も、コンピュータが処理するデジタルデータや命令を、ある一定の期間記憶しておくために働いています。
そして、このCPUとメモリなどのことをシステムの「リソース(資源)」と呼んでいます。
ソフトウェアアプリケーションは動くためにこの「リソース」を必要とするのですが、それぞれのアプリケーションが勝手に好きなままリソースを使ってしまうと、リソースには限りがあるため、あっという間にリソースが足りなくなってしまいます。
その上でみなさんが追加で他の作業を行おうとすると、残っているリソースがないため、ユーザであるみなさんが不便な思いをしてしまうことになります。
そこで、そのシステムのリソースをうまく割り振ることのできるソフトウェアが、システムのリソース管理を任されています。そしてこの重要な役目を担っているのがカーネルのなのです。
カーネルには他にも、図に示すような機能があります。
カーネルでは、アプリケーションやサービスなどのプログラムの実行を「プロセス」という単位で管理しています。
CPUのコア(実際に処理を行う演算回路)を上手にプロセスに割り当てられる(スケジューリングできる)かどうかが、ユーザーの使い心地を大きく左右します。
また、コンピュータにはさまざまなデバイス(キーボードやディスプレイモニター、プリンターなどなど)がつながっています。これらのデバイスを制御するソフトウェアが「デバイスドライバ」です。
ほかにもメモリやネットワーク、ファイルシステムなどをカーネルが管理しています。
このように、カーネルはリソースを自由に操ることのできる、特別な権限を持っています。一方、アプリケーションは勝手なことができないよう、リソースに触れる権限を持たされていません。
アプリは通常「システムコール」と呼ばれる仕組みを使い、カーネルに依頼をします。
システムコールには、ファイルの操作(ファイルの作成、ファイルのオープンやクローズ、ファイルの読み書きや削除など)や、メモリ管理(メモリの確保や開放)、プロセス制御(プロセスの作成や終了、シグナルの送受信など)、ネットワーキング(ネットワーク接続の確率やデータの送受信など)など、さまざまな処理があります。
また、OSが動作するのに必要なカーネル以外の部分のことを「ユーザランド」と呼びます。ユーザランドは、ファイルシステムやファイル操作コマンドなど、基本的なソフトウェアのまとまりのことを指します。
図として示すと、以下のような具合です。
なお、画像に記載されている「広義のLinux」「狭義のLinux」については、このあとすぐに後述します。
Linuxとは?
さて、前提知識を学習したところで、本記事の本題であるLinux(リナックス)の説明に移っていきましょう!
―――と、大見得を切った直後に歯切れの悪いことを言って申し訳ないのですが、先ほどの画像にも出てきた通り、Linuxには実は「広義の意味でのLinux」と「狭義の意味でのLinux」があります。
狭義の意味でのLinuxとは、フィンランド・ヘルシンキ出身のプログラマであるリーナス・トーバルズ(Linus Torvalds)氏により開発され、1991年に一般公開された、オープンソースのカーネルのことを指します。
オープンソースとは、コンピュータプログラムの著作権の一部を開発者が放棄し、ソースコードの自由な利用や配布をすべての人々に許可をする、ソフトウェアの開発モデルのことです。
また、広義の意味でのLinuxとは、上記のLinuxカーネルを使用するOSのことをいいます。
LinuxカーネルとLinux OS、どちらの事も通称「Linux」と呼んで差し支えはありませんが、一般的にはLinuxカーネルを使用するOS、つまり広義の意味の方を「Linux」と呼ぶことのほうが多いようです。
そのため、本記事内でも単に「Linux」と記載した場合はOSのLinuxを指し、Linuxカーネルを指す場合はそのまま「Linux カーネル」と表記することとします。
カーネルのLinuxもOSのLinuxも、オープンソースのため実質無償、かつ自由に利用や改変などができることから、これまでに多くの個人や組織がその開発に参加してきましたし、現在に至ってもなお非常に活発に開発が行われています。
また今日(こんにち)では、GoogleやFacebookなどの大規模なインターネット企業はLinuxを基盤としたサーバーを使用していますし、AWS(Amazon Web Services)やMicrosoft Azureなどのクラウドプロバイダーは、Linuxをベースとした仮想マシンやコンテナを提供しています。
その他、スーパーコンピュータや各種組み込みシステムでも使用されていますし、身近なところでは、AndroidのOSはLinuxカーネルをベースに開発されています。
こうしてLinuxが多岐に利用されている理由は、Linuxが以下のような特徴を持つためです。
- オープンソースであるため、誰でも自由かつ実質無償で利用することができる
- 質の高い多くのソフトウェアがLinux上で利用できる
- 世界中でサーバ用途として広く利用されているため、信頼性が高く、また汎用性もお墨付き
- 操作を自動化するための仕組みが用意されており、サーバの運用が行いやすい
みなさんが利用しているさまざまなWebサービスも裏側では多くの場合Linuxが使われていますし、サーバのOS環境にLinuxを使用することは現在ではきわめてポピュラーで基本的な構成になっています。
こうした背景から、ITエンジニアとして仕事をしていくうえにおいて、Linuxの基礎知識はもはや必修ともいっても過言ではありません。
また、Linuxの技術は長い時間をかけて多くのユーザに開発され、検証が繰り返されてきました。その結果この先大きく変わる可能性も低く、また汎用性がきわめて高いため、一度習得すれば長く使い続けることのできる技術であることも学習するうえでの大きなメリットといえます。
利用するメリットの多いLinuxですが、開発当初はインストールすることが非常に難しく、一般のユーザーが使用するにはとてもハードルの高い代物でした。
そこでさまざまな団体やコミュニティが、Linuxを使ううえで必要ないくつものソフトウェアなど諸々をまとめてパッケージ化し、利用者が手軽にインストールして使用できるようにしました。これを「Linux ディストリビューション」と呼んでいます。「ディストリビューション」と短く呼ぶことも多々あります。
このLinuxディストリビューションは、配布している団体やコミュニティによって内容の組み合わせや構成が異なります。
現在ではとてもたくさんのディストリビューションの種類が存在しますが、その中でも主流なものは大きく2系統に分けられます。
それが「Red Hat Linux」を起源とするRed Hat(レッドハット)系と「Debian GNU/Linux」を起源とするDebian(デビアン)系です。
系統 | ディストリビューション |
---|---|
Red Hat系 | Red Hat Enterprise Linux(RHEL), Fedora, CentOS |
Debian系 | Debian GNU/Linux, Ubuntu |
なお今回は、各ディストリビューションについてや、そのインストール方法について詳しく述べることはしません。ディストリビューションの内容や差異についてご興味のある方は、書籍やインターネット上に多くの情報がありますので、そちらをぜひご参照ください。
また上記の他にもたくさんの種類があるLinuxディストリビューションですが、当記事内で扱う内容はどのディストリビューションであっても基本的に共通である部分がほとんどです。そのため、共通部分の説明や解説であると思っていただければと思います。
Linuxに触れる前に
実際にLinuxに触れる前に、もう少しだけLinuxについての説明を続けます。
まずは、前段階として「GUIとCLI」について、そしてLinuxを操作するうえで欠かせない「シェル」について、順を追って説明していきます。
人がコンピュータを操作するには、使う人の意思を何らかの手段でコンピュータに伝えなければなりません。
たとえばスマホやタブレットPCは画面を指でなぞって操作を行いますし、パソコンではマウスやトラックパッドを使用しウィンドウやアイコンをクリックしたり、ドラッグしたりします。
これらは視覚的かつ直感的で、多くの人にとっては敷居が低く簡単な操作方法です。こうした、使い手の視覚に訴えるやり方を、グラフィカルユーザーインターフェース(Graphical User Interface)、略してGUIと呼んだりします。
そうしたGUIと対照に位置するのがコマンドラインインターフェース(Command Line Interface)、略してCLIと呼ばれるものです。
CLIは主にキーボードから打ち込んだ文字列をコンピュータへの指示や命令として入力し操作する方法です。この命令の文字列のことを「コマンドライン」、コンピュータへ出す指示や命令のことを「コマンド」と呼びます。またCLIではコマンドを入力したあとの結果も、文字列として表示されます。
たとえば、「あるディレクトリから、ファイルの名前がaからはじまるファイルすべてを選択する」という処理を考えてみましょう。
GUIでは、ファイルブラウザに表示されているファイル一覧を、画面越しに目で見て、ファイルの名前がaで始まるファイルを1つずつクリックしていく必要があります。
ファイルが10個程度であれば「簡単だ」と思うかもしれません。ですがそのファイルの数が100個、1,000個、もしくは10,000個もあったらどうでしょう? クリックするだけでも大変な作業です。また、もしかしたらファイルの見落としなどが発生してしまうかもしれません。
一方、LinuxのCLIでは、以下のようにコマンドを書くことで、aで始まるファイル名のファイルを選択することができます。
$ ls a*
たったこれだけです。
そのうえ、見落としや選択漏れも発生しません。どちらの操作が効率的か、もうお分かりですよね?
このように、一見すると複雑かつ面倒にも思えるCLIですが「作業効率の向上」や「人為的ミス防止」に役立つほか、「プログラムの連携」や「処理の自動化」などのより高度な操作を柔軟に行うことができるなど、多くのメリットがあるやり方なのです。
Linuxカーネルの働きはすでにご説明したとおりなのですが、このLinuxカーネル、実はユーザが直接操作することはできないような仕組みになっています。そのため、操作の際にはユーザとカーネルをつなぐ橋渡し役が必要になってくるのですが、その橋渡し的役目を担うソフトウェアの名前を「シェル」といいます。
シェルの働きは以下のような流れです。
- たとえば、ユーザによってキーボードからコマンドが入力されたとしましょう(入力)
- そのコマンドを受け取ったシェルが、ユーザからの指示を解釈します。(入力)
- そしてシェルがコマンドの実行をLinuxカーネルに依頼をします。(入力)
- Linuxカーネルはコマンドの実行を行い、その結果をシェルへ渡します。(出力)
- すると、今度はシェルがユーザの画面に結果を表示してくれます。(出力)
こうした、ユーザとLinuxカーネルの仲介役こそが「シェル」の役目なのです。
そして私たちユーザがLinuxの操作をするには、これまで流れを見てきたように基本的にシェルを通しての操作になります。つまり本記事で扱う操作も、すべてシェルにおける操作ということです。
以上のことからも、Linuxを扱うためにはいかにシェルの扱い方を理解する必要があるのか、ご理解いただけたかと思います。
なお余談ですが、カーネル(kernel)は日本語に訳すと「核」、そしてシェル(shell)は「貝」や「殻」という意味の言葉です。ユーザとカーネルの間に「殻」のように存在する、というのがシェルの語源のようです。
貝のようにカーネルを包み込み、ユーザにとって使いやすい機能を提供してくれているのがシェルなのです。
ディレクトリとファイルについて
WindowsやmacOSでは、アプリや文書、音楽、動画、画像などのデータ(情報)はファイルとして保存されます。そしてこうしたデータを格納したいくつかのファイルをフォルダという入れ物にまとめることで、管理をしやすくしています。このデータの取り扱い方法はLinuxでも同様です。
ただし、LinuxはWindowsやmacOSとは明確に異なる点がいくつかあります。
1つ目はフォルダの名称です。WindowsやmacOSでフォルダと呼ばれるものを、Linuxでは「ディレクトリ」と呼びます。
2つ目はファイルの種類です。
先ほど挙げたユーザデータ(アプリや文書、音楽、動画、画像など)のファイルに加えて、Linuxではシステム全体も1つ1つのファイルとして構成されています。
たとえばハードディスクやキーボード、プリンタといった入出力装置にはそれぞれのファイルが割り当てられており、そのファイルを介して機器を操作することが可能です。またLinuxカーネルも1つのファイルですし、システムの動作設定もコンフィグファイルと呼ばれるファイルに記述がされています。
このようにLinuxではあらゆるものがファイルとして管理されているため、Linuxを使いこなすにはファイルの取り扱いについてもしっかりとした知識を持っている必要があります。
下の図は、Linuxの一般的なディレクトリ構造です。簡単にではありますが、各ディレクトリに格納されている内容の説明も添えています。
なおここでは主なディレクトリのみを表記していますが、実際には図に描かれていないディレクトリも多く存在します。
一番左上の「/」というディレクトリは、このスラッシュ記号(/)一文字だけでルートディレクトリと呼びます。システムの最上位の階層にあり、すべてのファイルとディレクトリの起点となっています。
Linuxのディレクトリ構造は、このルートディレクトリを頂点とした階層構造になっています。このような構造をツリーと呼ぶため、ディレクトリ構造は「ディレクトリツリー」と呼ばれます。
ツリー(tree)、つまり木といわれてもいまいちピンとこないかもしれませんが、これは実はルートディレクトリ部分が根っこに、各ディレクトリが葉に相当する、樹木が横倒しになった形を表しているのです。ルートディレクトリも、樹木であれば根っこの部分にあたるため、英語の「根(root)」という名前が付けられています。
また、ユーザが現在位置しているディレクトリのことを「カレントディレクトリ」または「ワーキングディレクトリ」と呼びます。カレントディレクトリまたはワーキングディレクトリとは、ユーザの現在地のことです。
Linuxのすべてのディレクトリをご紹介するのは難しいため、ここではとくに重要とされているディレクトリの役割を簡単に解説します。
なおディストリビューションによってディレクトリ構造に若干の違いはありますが、ここで挙げるディレクトリはどのシステムでも同じ役目を持つ代表的なものばかりです。
ディレクトリ名 | 詳細 |
---|---|
/bin(Binary Directory) | 一般ユーザおよび管理者ユーザの両方が利用するコマンドの、実行ファイルが格納されている。 実行ファイルはLinuxのさまざまな場所に配置されているが、/binはとくにLinuxシステムの動作に必要最低限必要な、重要度の高いコマンドを格納。 |
/boot(Boot Directory) | Linuxカーネルとその設定ファイルなど、システムの起動に必要なファイルが格納されている。 bootディレクトリを誤って変更してしまうと、LinuxなどのOSが正常に起動しなくなることがあるため注意が必要。 |
/dev(Device Directory) | デバイスファイルを格納するディレクトリ。 デバイスファイルとは、ディスクやキーボードなどのハードウェアをファイルとして扱うことができるよう用意された、特殊なファイルのこと。 |
/etc(Etcetera Directory) | システム全体の設定ファイルが格納されている。ネットワーク設定、ユーザ設定、サービス設定などが含まれる。 またLinux自体の設定に関わるファイルもこのディレクトリにあるため、Linuxを管理・運用する上で非常に重要なディレクトリ。 |
/home(Home Directory) | ユーザごとに割り当てられる、ホームディレクトリが格納されているディレクトリ。 ホームディレクトリとは、Linuxのユーザごとにそれぞれ割り当てられている個人用ディレクトリのことで、ユーザ名がそのままディレクトリとなっている(上の図では「zomy」)。ユーザはこのホームディレクトリ内に自由にファイルやディレクトリと作成して作業を行うことができる。 |
/sbin(System Binary Directory) | /binと似ており、これも実行ファイルを置くためのディレクトリ。ただしこちらには管理者ユーザ向けのコマンドが置かれている。 |
/usr(User System Resources Directory) | 各種アプリケーションとそれに付随するファイルや、システムの共有リソースを置くためのディレクトリ。 /usrディレクトリは、そのサブディレクトリとしてbinやsbinなどを持ち、内部にルートディレクトリ配下と似た構造を持つ。 |
/var(Variable Directory) | 変化するデータ(可変データ)が格納されるディレクトリ。 ログファイルやデータベース、メールなどが含まれる。システム管理の上では容量を圧迫しないよう注意が必要。 |
WindowsやmacOSなどでは、マウスを操作しディレクトリ(フォルダ)を画面上でクリックして階層の行き来をすると思います。一般的に、皆さんに馴染み深いフォルダへの移動方法は、こうした画面上での操作だと思います。
ですがLinuxの場合は文字列で移動先を指定し、目的のディレクトリまで移動をします。このファイルやディレクトリの所在を示す文字列のことを「パス」といいます。
パスは目的地までの道順を書き記すイメージです。パスという名称も、英語の「道(path)」から来ています。
例えば、下の図のようなディレクトリツリーにおいて、ルートディレクトリから出発し、[いちご.jpg]ファイルを開くことを考えてみましょう。
この場合は[ルートディレクトリ]→[画像]ディレクトリ→[いちご.jpg]ファイルの順に辿ることで、ルートディレクトリから[いちご.jpg]ファイルまで移動することができます。
そしてこうしたパスによる移動は、次の4つのルールに従って記述をすることになっています。
ルール1 ディレクトリやファイルは「/」(スラッシュ)で区切る
ルール2 パスのはじまりが「/」のときは、左端にルートディレクトリが省略されているものとする
ルール3 カレントディレクトリ(現在地)は「.」で表す
ルール4 1階層上のディレクトリ(親ディレクトリ)は「..」で表す
フォルダやファイルの階層構造は「/」(スラッシュ)で区切ります。たとえば上の図の[いちご.jpg]ファイルを指定する場合は、次のような文字列でパスの指定をします。
/画像/いちご.jpg
/画像/いちご.jpg
のようにパスが「/」からはじまる場合、それは「ルートディレクトリから出発したパス表記」であることを意味しています。この、ツリー構造の最上位であるルートディレクトリからのパス指定のことを「絶対パス」もしくは「フルパス」といいます。
絶対パスは曖昧さのない確実なパス表記ではありるものの、階層が深い位置にあるディレクトリを指定する場合はかなり長い文字列表記となり、その点が少々不便でもあります。
パスは、現在地であるカレントディレクトリから指定をすることも可能です。ルートディレクトリから指定する場合、パスは「/」からはじめますが、カレントディレクトリから指定する場合は「./」からはじめます。この「.」(ドット)はカレントディレクトリを意味しています。
例えば上の画像のように、[画像]ディレクトリを現在地としている場合において、[画像]ディレクトリ→[高解像度]ディレクトリ→[もも.jpg]とパスを指定する場合は次のようになります。
./高解像度/もも.jpg
この、現在地のディレクトリ(カレントディレクトリ)を出発地点として表記されるパスのことを「相対パス」と呼びます。
なお当然のことながら[もも.jpg]ファイルはルートディレクトリから絶対パスで指定することも可能です。その場合は次のようなパス指定となります。
/画像/高解像度/もも.jpg
これまでは、ルートディレクトリからの指定方法(絶対パス)またはカレントディレクトリよりも下の階層にあるファイルをやフォルダの指定方法(相対パス)を説明してきました。
絶対パスの場合は、最上位にあるルートディレクトリからパスを指定するので、パスの指定は常に上から下へと向かいます。ですが相対パスの場合は、カレントディレクトリよりも上の階層のファイルやフォルダを指定するケースもあります。
たとえば、下の図において、カレントディレクトリである現在地が[高解像度]ディレクトリの場合に、[ぶどう.jpg]ファイルを指定する場合を考えてみましょう。
上の図のようなツリー構造の場合、相対パスで[ぶどう.jpg]ファイルを指定するには、いったん1つ上の階層にある親ディレクトリである[画像]ディレクトリに上がってから、[資料]ディレクトリ→[ぶどう.jpg]ファイルへと階層を下がっていく必要があります。
このように階層を上がる際に指定するのが「..」(ドット2つ)です。つまり、カレントディレクトリが[高解像度]ディレクトリの場合に、相対パスで[ぶどう.jpg]ファイルを指定するには、次のようにパスを指定します。
../画像/資料/ぶどう.jpg
パス行頭の「../」が、1つ上の階層(上の図ではルートディレクトリ)を指しています。このように「./」「../」を使い分けることで、カレントディレクトリから見て上(親)に位置する階層へ移動をしたり、また下(子)に位置する階層へ移動したりすることができ、結果的にあらゆるファイルやディレクトリをパスで指定できるようになります。
なお当然のことながら、[ぶどう.jpg]ファイルを絶対パスで指定することも可能です。その場合は次のようにパスを指定します。
/資料/ぶどう.jpg
このように、システム内に保存されている特定のファイルやディレクトリを指定する方法には、絶対パスと相対パスの2種類があること、そしてそれらが上記のルールによって指定されていることをしっかりと確認しておいていただければと思います。
ディレクトリの操作の基本
Linuxのディレクトリ構造やパス表記などについて理解したところで、ここからは実際にディレクトリを操作していく方法を学んでいきます。
下の図の[zomy@localhost~]$
の部分はコマンドプロンプトといいます。コマンドの入力を待ち受けていることを示す文字列です。ですので、実際にユーザである皆さんが打ち込む部分は「コマンド」と書かれている短い文字列部分です。
そしてコマンドを実行するためにエンターキーを押すと、出力結果が出力された、という図になっています。
Linuxのログイン直後は、カレントディレクトリはユーザのホームディレクトリになっています。そのためまずは、カレントディレクトリを表示するpwdコマンドで自分の現在地を確認してみましょう。
なお、分かりやすいように、打ち込むコマンドの色をオレンジ、ほか表示される結果などは白で記載をしています。またコマンドプロンプトのユーザ情報は省略し、$の部分だけを残しています。以降も同様です。
$ pwd
/home/zomy
たとえばあなたがzomyユーザの場合、基本的にはログイン直後は/home/zomyがカレントディレクトリ(現在地)となっています。カレントディレクトリを変更する際には、このあとに説明をするcdコマンドを利用します。
シェルでファイルなどを操作する際には、カレントディレクトリが起点となります。そのため、なにか作業をする前にはまずpwdコマンドを実行して、カレントディレクトリを確認する癖をつけておくと作業ミスが減る、という対策も有効です。
pwd(print working directory):現在どの位置にいるかを確認する
lsコマンドは、ディレクトリ内のファイルやディレクトリの一覧を表示するために使用される、非常に便利なコマンドです。
デフォルトでは、カレントディレクトリ内のファイルとディレクトリの名前を表示します。
基本の使用方法は以下のとおりです。
$ ls [オプション] [ファイルまたはディレクトリ名]
たとえば、次のような形で使用することができます。
$ ls
ダウンロード デスクトップ ビデオ 画像
テンプレート ドキュメント 音楽 公開
上記はカレントディレクトリ内のファイルとディレクトリの一覧を表示している様子です。
またlsコマンドの後にファイルやディレクトリを指定し、指定したディレクトリ内にあるファイルやディレクトリを一覧表示することも可能です。
$ ls /
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
上記は/(ルートディレクトリ)
の中身を一覧表示した結果です。
なおlsコマンドはカレントディレクトリにファイルが1つもない場合は、下記のようになにも表示をすることなく終了します。
$ ls
$
また以下のようなオプションもあります。
-a
隠しファイルも含めたもすべて (All) のファイルを出力表示します。-l
ファイル名だけでなく、ファイル属性などの詳細情報も併せて長 (long) 形式で出力表示します。-t
最終更新時間 (time) によって、ソートをして出力表示します。-r
逆順 (reverse) にソートをして出力します。-F
ファイル名の後ろにファイルの種類を意味する記号を追加して表示します。
たとえば、lsコマンドに-l
オプションを追加して内容を表示させてみましょう。
$ ls -l
合計 27
1rwxrwxrwx. 1 root root 7 7月 21 19:30 bin -> usr/bin
dr-xr-xr-x. 4 root root 4096 9月 4 00:01 boot
drwxr-xr-x 18 root root 2900 9月 26 00:12 dev
︙
-l
オプションで表示される各項目は、以下のような意味となっています。
それぞれの項目について詳細に解説することは今回はしませんが、ファイルタイプが「–」ならば通常ファイル、「d」ならばディレクトリ、ということは覚えておいていただけるといいかと思います。
「l」が意味するシンボリックリンクはのちほどご説明します。
他、よく使われるオプションとしては-a
オプションがあります。-a
を指定すると、隠しファイルも含めたすべてのファイルを表示します。
$ ls -a
. .autorelabel boot etc lib media opt root sbin sys usr
. . bin dev home lib64 mnt proc run srv tmp var
デフォルトのlsコマンドでは、ファイル名が.(ドット)で始まるファイルを隠しファイルとみなして表示しません。ですが-a
オプションをつけると、これらの隠しファイルを含めて表示するようになります。
また-F
オプションを付けると、ファイル名の後ろにファイルの種類を意味する記号を追加して表示します。
$ ls -F
bin@ bev/ home/ lib64@ mnt/ proc/ run/ srv/ tmp/ var/
boot/ etc/ lib@ media/ opt/ root/ sbin@ sys/ usr/
一目でファイルの種類が便利なため、この-F
オプションも利用頻度の高いオプションです。なお、ファイルの種類と表示される記号は次のとおりです。
種類 | 記号 |
---|---|
通常ファイル | なし |
ディレクトリ | / |
実行可能ファイル | * |
シンボリックリンク | @ |
ls(list):ファイルやディレクトリの一覧を表示する
cdコマンドはカレントディレクトリを変更するためのコマンドです。
基本の使用方法は以下のとおりです。
$ cd [ディレクトリのパス]
たとえば/usr
ディレクトリへ移動をしてみるとしましょう。
$ cd /usr
cdコマンドはカレントディレクトリを変更したとしても「カレントディレクトリを移動しました」などの余計なメッセージは一切表示しません。このようにLinuxコマンドは成功した場合はなにも表示をしないのが普通です。
実際正しく移動できているのか確認をしたい場合は、pwdコマンドを使用して確認をしましょう。
$ pwd
/usr
また、指定するディレクトリのパスは絶対パスと相対パスのどちらでも指定が可能です。
その他、特定のディレクトリに移動するためのショートカットもあります。
コマンドラインの~
(チルダ)はシェルによりユーザのホームディレクトリのパス(この例ではhome/zomy)へと自動的に置き換えられます。
$ cd ~
/home/zomy
シェルのこの機能をチルダ展開と呼びます。
また、cdコマンドは単独での実行でもホームディレクトリへ移動することができます。
$ cd
/home/zomy
ホームディレクトリはよく使用するディレクトリのため、このように簡単に移動できるようになっているのです。
cd(change directory):カレントディレクトリを変更する
mkdirコマンドは、新しいディレクトリ(フォルダ)を作成するためのコマンドです。
基本の使用方法は以下のとおりです。
$ mkdir [作成するディレクトリ名]
たとえば、mkdirコマンドを使用し「work」という名前のディレクトリを作成する場合の記述は、次のようになります。
$ mkdir work
workディレクトリが正しく作成できたかどうかを確認するには、lsコマンドに-F
オプションをつけて確認してみましょう。
$ ls -F
memo.txt temp work/
work/
はworkという名前のディレクトリ、という意味ですので、正しく作成できたということが確認できました。
mkdir(make directory):新しいディレクトリを作成する
touchコマンドは、新しいファイルを作成するか、既存のファイルの更新日時を変更するために使用されるコマンドです。基本的には、指定されたファイルが存在しない場合は新しいファイルを作成し、存在する場合は更新日時を更新します。
基本の使用方法は以下のとおりです。
$ touch [ファイル名]
例としては、次のように使用することができます。なお複数のファイルを一気に作成することも可能で、その場合はスペースで区切り、作成したいファイル名を並べればOKです。
$ touch file_name1 file_name2
上記は「file_name1」と「file_name2」を新規に同時作成したということになりますね。なおtouchコマンドによって新規に作成されたファイルは空の状態になっています。
touchコマンドでのファイル作成は、誤って既存のファイル名を指定したとしても、内容が上書きされたり削除されたりはせず、更新日時が現在の時刻に書き換わるだけですので安心です。
touch:新しい空のファイルを作成するか、既存のファイルの更新日時を変更する
ファイルの作成について学んだので、次はファイルの削除についてのコマンドを学んでいきましょう。ファイル削除の際にはrmコマンドを利用します。
基本の使用方法は以下のとおりです。
$ rm [オプション] [ファイルまたはディレクトリ]
たとえば、次のように使用することができます。
$ rm file_name1
上記のコマンドでは、file_name1
という名前のファイルを削除したことになります。
上記はファイル削除の場合ですが、ディレクトリを削除したい場合は、以下のように-r
オプションを使用する必要があります。
$ rm -r directory_name
上記のコマンドは、directory_nameという名前のディレクトリを丸ごと削除します。つまり、ディレクトリ内に入っているすべてのファイルとサブディレクトリも削除されます。
注意点としては、rmコマンドでの削除操作は取り返しのつかない変更であるため、慎重に使用する必要がある、ということです。削除前には削除対象に間違いがないか必ず確認し、可能であれば念のため必要なデータのバックアップを行うことをオススメします。
また通常rmコマンドで削除をする際には確認などを求めてくることはなく、実行後はすぐにファイルなどが削除されますが、確認がない通常状態でのコマンドの実行が心配な方は、削除前に確認を求めるようできる-i
オプションを付けるようにすると、より安心かもしれません。
$ rm -i file1
rm: 通常の空ファイル `file1` を削除しますか?
上記確認が表示された場合は、YESを意味するyまたはYを入力した後にEnterキーを押すと、ファイルが削除されます。
rm(remove):ファイルを削除する
rmコマンドと似たコマンドに、rmdirコマンドがあります。これは空のディレクトリを削除するコマンドです。ディレクトリが空でない場合はrmdirコマンドでは削除されずにエラーが発生します。
基本の使用方法は以下のとおりです。
$ rmdir [空のディレクトリ名]
たとえば、次のように使用できます。
$ rmdir directory_name
上記のコマンドでは、directory_name
という名前の空のディレクトリを削除することができます。
rmコマンドとの大きな違いは、rmdirコマンドは中にファイルなどがあるディレクトリを削除しようとしてもエラーになるという点です。
このrmdirコマンドが一番有効なのは、ファイル名が.(ドット)で始まる隠しファイルがディレクトリの中にあった場合です。rmdirコマンドを使用することで、中にファイルが残っていることに気が付かずにディレクトリを誤って削除してしまう、という事故を防ぐことができるというわけです。
rmdir(remove directory):空のディレクトリを削除する
catコマンドはテキストファイルの内容を表示したり、複数のファイルを連結し表示するために使用される、非常に便利なコマンドです。
基本の使用方法は以下のとおりです。
$ cat [オプション] [ファイル名]
たとえば、touchコマンドで新規に作成したばかりの「new_file」の内容を、catコマンドで表示させてみましょう。
$ touch new_file
$ cat new_file
$
新規に作成したばかりの「new_file」は中身が空のためなにも表示はされませんでしたが、コマンドプロンプトの右側にブランクがあることで、間違いなく空の中身を表示していることを意味しています。
またcatコマンドでは、複数のファイルを連携して表示することもできます。その際には表示させたファイルの内容ごとに区切り記号が入る、などということはなく、ファイルの内容がただ順番に、境目なく、まるで1つのファイルかのように表示がされます。
たとえば/etc/hostname
と/etc/crontab
の中身を連結して中身を表示させてみましょう。
$ cat /etc/hostname /etc/crontab
localhost.localdomain
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
︙
赤い文字で表示されている部分が/etc/hostname
の内容、青い文字で表示されている部分が/etc/crontab
の内容です。先ほど説明した通り、表示しているファイルが切り替わっても特に区切り線などはなく、同一のファイル内容を表示しているかのように、連結して表示されていますね。
なお、表示内容を分かりやすく説明するために赤文字・青文字と色分けをしていますが、実際は文字の色も変わらずに表示がされています。
またcatコマンドでよく使われるオプションには、行番号をつけて内容を表示する-n
オプションがあります。
基本的な使い方は以下のとおりです。
$ cat -n /etc/crontab
1 SHELL=/bin/bash
2 PATH=/sbin:/bin:/usr/sbin:/usr/bin
3 MAILTO=root
︙
行番号をつける-n
オプションは、特にプログラムのソースコードやリストの表示などを行う際に役立つことが多いようです。
以上がcatコマンドの基本的な使用方法です。
これで言葉だけではわかりにくいcatコマンドの働きが、少しは理解しやすくなりましたでしょうか?
cat(concatenate):テキストファイルの内容を表示する、または複数のファイルを連結し表示する
lessコマンドは、テキストファイルの内容をページ単位で表示するためのコマンドです。表示したいファイルの内容が大きく行数も多い場合は、1画面に収まりきらないこともあります。このような長いファイルの内容を見たいときに便利なコマンドがlessコマンドです。
基本の使用方法は以下のとおりです。
$ less [オプション] [ファイル名]
ここでは例として、/etc/bashrc
というbashシステム設定ファイルをlessコマンドで見てみることにしましょう。
$ less /etc/bashrc
なお、ディストリビューションによっては/etc/bashrc
ではなく/etc/bash.bashrc
というファイルが用意されていることもあります。その場合は/etc/bash.bashrc
を指定することで、今回と同様の画面操作をすることが可能となります。
上記コマンドで/etc/bashrc
を確認した場合の画面表示は、以下のとおりです。
![](https://zomy-blog.com/wp-content/uploads/2023/07/f0a04aa351d66e7b00a93a920346368b-1024x597.jpg)
ファイルの中身が大きく、実際の画面では1画面では収まりきらない分量が表示されており、何度かスクロールが可能な状態です。
こうしたいくつもの画面に渡って内容が表示がされる場合に、以下のキー操作を行うことによって表示する画面などを思い通りに操作することができます。
キー操作方法 | 機能 |
---|---|
スペースキー、f、Ctrl+v | 1画面下にスクロールする |
b、Meta+v | 1画面上にスクロールする |
j、Ctrl+n、Enterキー、下矢印キー | 1行下にスクロールする |
k、Ctrl+p、上矢印キー | 1行上にスクロールする |
q | lessコマンドを終了する |
一見すると複雑にも見えるキー操作方法ですが、最初のうちはEnterキーや矢印キー、そしてqキーによるlessコマンドの終了方法などを操作することができれば十分かと思います。
またlessコマンドでは、現在開いているファイルのなかから任意の文字列を検索することも可能です。当該ファイルを表示している間に[/](スラッシュ)を入力すると、画面の一番下の行が検索文字列の入力欄に切り替わります。
以下はlessコマンドでの検索手順です。
- lessコマンドを実行し、テキストファイルの内容を表示します。
- /キーを押します。
- 検索したい文字列を入力します。
- Enterキーを押します。一致する検索語句までジャンプします。
なお、一致するテキストが見つかるたびに、検索語句がハイライトで表示されます。
検索モードでの操作中には以下のキー操作が利用できるようになります。
キー操作 | 機能 |
---|---|
/<文字列> | 下方向に向かって検索する |
?<文字列> | 上方向に向かって検索する |
n | 次の一致箇所へジャンプする |
N | 前の一致箇所にジャンプする |
文章を読むだけでは挙動が分かりにくいかと思いますので、ぜひお手元で操作をしながら少しずつキー操作に慣れていくといいでしょう。
less:テキストファイルの内容をページ単位で表示する
cpコマンドは、ファイルやディレクトリをコピーするためのコマンドです。基本的には指定したソースファイルやディレクトリを指定したディレクトリにコピーします。
基本の使用方法は以下のとおりです。
$ cp [オプション] [コピー元(ソース)] [コピー先]
たとえば、「copy1」を「copy2」にコピーする場合は以下のように実行します。
$ cp copy1 copy2
上記のコマンドによる結果は、「copy1」と「copy2」の種別などによって、結果が少々変わります。結果は大きく分けて以下の3通りです。
- ファイルを別名のファイルとしてコピーする:もし「copy1」と「copy2」の種別がどちらもファイルで、その上「copy2」が存在しないファイルであった場合は、「copy1」のコピーとして「copy2」が新規に作成されます。
- ファイルをディレクトリにコピーする:また「copy1」がの種別がファイル、「copy2」の種別がディレクトリの場合、ディレクトリ「copy2」の下に「copy1」のコピーが作成されることになります。
- ファイルを新しいファイルで上書きする:「copy1」と「copy2」の種別がどちらもファイルで、そのうえ「copy2」がすでに存在している場合は、「copy2」が「copy1」のコピーで上書きされます。
またディレクトリ内にコピーする場合は、以下のように、複数のファイルをまとめて指定することも可能です。
$ cp copy1 copy2 copy3 directory
上記コマンドでは「directory」というディレクトリ内に、「copy1」「copy2」「copy3」という3つのファイルを一気にコピーすることができます。
また、以下オプションを組み合わせることでcpコマンドの動作を自分好みにカスタマイズすることができます。
-i
:ファイルの上書きを確認します。既に同名のファイルが存在する場合、上書きするかどうかを尋ねます。-v
:詳細モード。コピーの詳細情報を表示します。-p
:ファイルの属性(パーミッションやタイムスタンプなど)を維持します。
cpコマンドでは、ディレクトリをコピーしようとするとエラーになってしまいます。そのため、ディレクトリをコピーする際は-r
オプションを指定する必要があります。
たとえば、ディレクトリ「directory1」をディレクトリ「directory2」にコピーしたい場合は以下のように実行します。
$ cp -r directory1 directory2
上記のコマンドによる結果は、以下のとおりです。
- ディレクトリを新規コピーする:もし「directory2」が存在しないディレクトリであった場合は、「directory1」のコピーとして「directory2」が新規に作成されます。
- 既存ディレクトリを上書きする:「directory2」がすでに存在している場合は、「directory2」は「directory1」の内容で上書きされます。
なお、-r
オプションでディレクトリをコピーすると、コピー元ディレクトリのなかにあったファイルやディレクトリもすべて含めたままコピーされます。
cp(copy):ファイルやディレクトリをコピーする
mvコマンドは、ファイルやディレクトリの名前を変更したり、ファイルやディレクトリを移動する際に使用するためのコマンドです。
mvコマンドの使用方法はcpコマンドと似ており、移動先がファイルかディレクトリかによって意味が変わります。
基本的な使用方法は以下のとおりです。
$ mv [オプション] [移動元(ソース)] [移動先]
たとえば、次のように使用することができます。
$ mv move1 move2
上記のコマンドによる結果は、「move1」と「move2」の種別などによって、結果が少々変わります。大きく分けて以下の3通りです。
- ファイルの名称変更:「move1」と「move2」の種別がどちらもファイルの場合は、ファイル「move1」がファイル「move2」へ名称を変更することになります。
- ファイルの移動:「move1」の種別がファイル、「move2」の種別がディレクトリの場合は、「move1」というファイルを、ディレクトリ「move2」の中へ移動したことになります。
- ディレクトリの移動:「move1」と「move2」の種別がどちらもディレクトリの場合は、ディレクトリ「move1」がディレクトリ「move2」の下へ、ファイルなどの中身もまるごと移動します。オプションなどは必要ありません。
なお次の例のように、移動先がディレクトリの場合は複数のファイルを一気に移動させることも可能です。
$ mv move1 move2 move3 directory
この場合上記のコマンドは、「directory」という名前のディレクトリの中へ、ファイル「move1」「move2」「move3」を移動させたことになります。
移動先のファイルがすでに存在する場合は、確認なしに上書きされてしまうという点も、cpコマンドと同様です。
また、以下オプションを組み合わせることでコマンドの動作を自分好みにカスタマイズすることもできます。
-i
: 上書きの確認を行います。もし移動先に同名のファイルやディレクトリが存在する場合、上書きするかどうかを尋ねます。-f
: 一部の処理ではmvコマンドが確認の問い合わせをしますが、その確認を無視して強制的に処理を実行します。-v
: 詳細モード。移動の詳細情報を表示します。
mv(move):ファイルやディレクトリの名前を変更する、もしくはファイルやディレクトリを移動する
lnコマンドは、リンク(シンボリックリンクやハードリンク)を張るためのコマンドです。リンクは、ファイルやディレクトリに別の名前を付けることで、異なる場所から同じファイルを参照できるようにします。
基本的な使い方は以下のとおりです。
$ ln [オプション] [リンク元ファイル名] [リンク名]
コマンドの詳細な説明に移るまえに、リンクについて先にご説明しておきましょう。
リンク機能は、ファイルをコピーしたり移動したりせずに、別のディレクトリにあるかのように扱うことができる機能です。これを「リンクを張る」と表現したりします。
たとえばファイルやディレクトリをコマンドで指定する場合、そのパスが長くて複雑になると、入力を誤ってしまう可能性も高くなってしまいます。
ですがリンク機能を使えば、よく使うファイルを自分のホームディレクトリにおいてあるように扱うことができ、作業効率が向上します。
リンクの種類は主に2種類、「ハードリンク」と「シンボリックリンク」があります。現在はシンボリックリンクが使われることが多く、ハードリンクが必要な場合は限定的です。本記事の範囲ではリンクが必要な場面はすべてシンボリックリンクを利用すると考えていただいていいでしょう。
なおファイルの別名と聞いてWindowsの「ショートカット」やmacOSの「エイリアス」を想像された方もいるかもしれませんが、シンボリックリンクは、まさにこれと似た機能の提供のことなのです。
リンク機能について少しはイメージが掴めたでしょうか?
次に、ハードリンクについての説明に移ります。
ハードリンク
ハードリンクは、例えるならファイルにつけられた別名、あだ名のようなものです。
例えば、AくんとBくんが同じ本を持っていて、その本には「Harry Potter」という正式なタイトルがついていたとしましょう。Bくんがその本を「魔法使いの本」という別名で呼んでいるとします。ハードリンクは、AくんとBくんが同一の本(同一データ)を「Harry Potter」と「魔法使いの本」という2つの名前で参照している状態です。
この話における「魔法使いの本」という別名がハードリンクです。
本来の名前も別名も結局は同じ本を指しているので、本の内容(ファイルなどのデータ)が更新された場合でも、どちらの名前からでも変更内容が見えます。
また、もし一方の名前が削除された場合でも、もう一方の名前からはまだ本の内容にアクセスすることができます。
たとえば「Harry Potter」という名前を削除しても、「魔法使いの本」という名前のリンクを知っている人がアクセスしてくる場合を考えて、本体は削除されずに残してあるのです。
そしてこの「魔法使いの本」という名前まで削除された時点で、このファイルは今後だれにも使われることはないと判断され、本体も削除されるという仕組みになっています。
ハードリンクの作り方は以下のとおりです。
$ ln book1 book2
上記コマンドでは、「book1」というファイルに対して「book2」という名前でハードリンクを作成しています。
これにより、別コマンドからファイル名として「book2」を指定すると、元の「book1」にアクセスできるようになりますし、たとえば「book2」の中身を確認した場合は、元々の「book1」の内容が表示されるようになります。
つまりハードリンクとは、1つのファイルの実体に複数の名前をつける機能のことです。
なお補足ですが、ハードリンクで追加した別名・あだ名は、どちらが本物の名前でどちらが仮の名前、という区別はありません。あえていうならば「どちらも本物の名前」といえます。
またハードリンクはディレクトリに対しては作成することができません。異なるディスク間をまたがることもできません。
くわえて、削除については前述のとおり、すべてのハードリンクが削除された際にファイルの実体も削除される仕組みになっています。
続いてはシンボリックリンクについての説明に移ります。
シンボリックリンク
ハードリンクは、ディレクトリに対して作成ができない、異なるディスク間をまたぐことができない、などいくつかの制限がありましが、シンボリックリンクにはそのような制限はありません。
シンボリックリンクはハードリンクと異なり、別ファイルシステムの間でも作成することも可能です。Windows ではショートカットと呼ばれるファイルと同じ考え方です。
また、たとえシンボリックリンクを削除しても本体のファイルに影響はありません。本体のファイルを削除すると、シンボリックリンクと繋がっているファイルが見つからなくなるため、アクセスがエラーとなるだけです。
シンボリックリンクは例えるなら、「目的地まで残り◯◯km」などと書かれている道案内の看板のようなものです。案内看板を見れば、どの道を通って目的地へ行けばいいのかが分かります。
シンボリックリンクも同じように、実際の場所ではなく道のりを示しています。
もし目的地の場所が変わったりなくなってしまうと、目的地を見つけることができなくなってしまうのです。
シンボリックリンクは、lnコマンドに-s
オプションをつけることで作成できます。具体的な使用方法は以下のとおりです。
$ ln -s path1 path2
上記のコマンドは、「path1」というファイルに対して「path2」という名前でシンボリックリンクを作成した例です。
シンボリックリンクのリンク先を確認するには、lsコマンドで-l
オプションを指定します。
なおls -l
は指定されたディレクトリ内のファイルとディレクトリの詳細な情報を表示するために使用されます。
次のように、どのファイルを指しているかが矢印で表示されます。
$ ls -l
合計 1
lrwxrwxrwx. 1 zomy zomy 5 7月 14 22:32 path2 - > path1
上記結果では、「path2」が「path1」のシンボリックリンクであることを示しています。
このようにシンボリックリンクとは、リンク先のパス名が書かれた擬似的なファイルのことです。ハードリンクとは違い、リンク先がファイルの実体であり本物のファイルです。
なお、先ほどの結果にて表示された文字列の意味については、以前にもご紹介した以下画像でご確認ください。
シンボリックリンクは、シンボリックリンクのみを削除することもできますし、シンボリックリンクを残したままリンク先の実体ファイルを削除することもできます。
この実体ファイルが削除されたシンボリックリンクはリンク先がなくなったため「リンクが壊れた」状態となります。シェルの設定にもよりますが、リンクが壊れている警告はおおむね赤色で表示がされます。
ln(link):リンクを張る
findコマンドは名前の通り、ファイルやディレクトリを探すために使用するコマンドです。特定の条件に一致するファイルやディレクトリを見つけることができます。
対象のファイルが複数あり一箇所にまとまっていない場合に、一つ一つのファイルを指定してコマンドを実行するのは面倒です。また、そもそもどのファイルに検索したい項目が含まれているのかがわからないと、指定すらままなりません。
そんなときに役立つのがfindコマンドといえます。
findコマンドは他のコマンドに比べ、オプション指定の方法が少々難しいため、ここで詳しい解説をはさみたいと思います。
まずはコマンドの基本的な使用方法のご紹介です。
$ find [検索開始ディレクトリ] [検索条件] [アクション]
findコマンドを実行すると、①「検索開始ディレクトリ」を起点として②「検索条件」を満たすファイルを探し③「アクション」を実行する、という流れでコマンドの実行が行われます。なお「検索条件」の部分になにも指定をしなかった場合には、すべてのファイルとディレクトリが検索の対象となることにも注意が必要です。
たとえば次の例では、①「.(カレントディレクトリ)」を起点として②「file-1.txt」という名前を持つファイルを探し③「-print」でそのパスを表示させるよう指示しています。
上記コマンドに関してもう少し詳しい説明を加えますと、上の例では「検索条件」として-name file-1.txt
を指定しており、この部分で検索するファイル名を絞り込んでいます。
また「アクション」部分では-print
を指定してます。これはパス名を表示するアクションで、findコマンドではもっともよく使用される基本アクションでもあります。アクションが指定されない場合には-print
が指定されたと解釈されるため、記述せずに省略しても結果は同じになります。
上記コマンドを実行すると、結果は次のように表示がされます。
$ find . -name file-1.txt -print
./file-1.txt
./dir1/doc/file-1.txt
見つかったファイルのパスが表示されています。ここでは2つのファイルが見つかったようですね。このようにfindコマンドでは、指定したディレクトリの直下ファイルだけでなく、ディレクトリツリーを順に下りながら検索条件に一致するファイルすべてを表示します。そのため、深いディレクトリにあるファイルも簡単に探し出すことができます。
findコマンドで利用可能な検索条件にはたくさんの種類がありますが、そのなかでも特によく使用される「-name」「-iname」「-type」の3つをご紹介します。
ファイル名で探す(-name、-iname)
findコマンドでファイル名を指定してファイルを探すには、検索条件に-nameもしくは-inameを指定してファイル名を与えます。-nameはファイル名の大文字小文字を区別しますが、-inameは区別しません。大文字小文字の区別以外、-nameと-inameは同じ働きをします。
-name pattern | ファイル名が「pattern」にマッチするなら真。「pattern」はシェルのパス名展開と同じ。 |
-iname pattern | -nameと同じだが大文字小文字の区別をしない |
ファイル名の指定には、ワイルドカードとして*
と?
が利用できます。パス名展開と同じく、*
は任意の文字列、?
は任意の1文字に一致します。
たとえば、次の例ではファイル名の末尾が.txt
であるファイルを検索します。
$ find . -name ‘*.txt’ -print
なお-nameで*
や?
を使用する場合は上の例のように”(シングルクウォート)を必ずつけて使用します。これは、*
などの記号はbashのパス名展開と解釈されないようにするためです。
もし*
などの記号をクウォートせずにそのまま使うと、*
がbashのパス名展開とみなされ、展開後のファイル名で置き換えられた文字列がfindコマンドに渡されてしまいます。
bashのパス名展開というとあまりピンと来ないかもしれませんので、例をご紹介します。
たとえば、カレントディレクトリに「file-1.txt」「readme.txt」という2つのファイルがある状態で、ワイルドカードを”で囲まなかったケースです。
シェルにより「file-1.txt」「readme.txt」という2つのファイルに勝手に置き換えられてしまうため、下記のような誤ったコマンドが実行されてしまうことになります。
$ find . -name file-1.txt readme.txt -print
こうして-nameに2つのファイルを指定したことになり、結果としてエラーが発生してしまい、うまく検索をかけることができません。
こうした意図しない事態を防ぐため、*
や?
を含む単語を”(シングルクウォート)もしくは“”(ダブルクォート)で囲みます。”(シングルクウォート)や“”(ダブルクォート)で囲んだ内部の文字列にはbashのパス名展開が行われないため、*.txt
という文字をそのままfindコマンドに渡すことができます。
ファイルの種類で探す(-type)
先ほどの-nameではファイル名で絞り込みを行いました。「-type [ファイルタイプ]」と指定することで、ファイルの種別により検索条件を絞り込むこともできます。指定できるファイルタイプは多くありますが、まずは次の3種類だけ覚えておけば十分でしょう。
指定 | ファイル種別 |
---|---|
-type f | 通常ファイル(ファイルのf) |
-type d | ディレクトリ(ディレクトリのd) |
-type l | シンボリックリンク(リンクのl) |
次の例では、カレントディレクトリ以下にあるディレクトリのみを表示しています。
$ find . -type d -print
.
./dir1
./dir1/doc
-type d
を指定しているため、ディレクトリだけが表示され、通常のファイルは表示されません。
複数の検索条件の指定(-a)
findコマンドでファイルを探すとき、検索条件を-a(AND)で区切って並べることで、複数の検索条件を同時に指定するAND検索ができます。
次の例では通常ファイルであり、かつ、ファイル名が.txtで終わるファイルのみが表示されます。「readme.txt」という名前のディレクトリがあっても、表示されることはありません。
なお、-a
は省略することが可能です。次のように単に単語を並べて書いてもAND検索になります。
$ find . -type f -name ‘*.txt’ -print
その他のオプション
findコマンドに使用可能なオプションは他にはいくつもあるため、ここですべてをご紹介することはできません。そのため、主なオプションを下記にて一覧にしご紹介します。
まずは検索に関するオプションです。
オプション | 意味 |
---|---|
-mtime –n | ファイルの最終更新時刻日時が、「n」日未満なら真 |
-mtime +n | ファイルの最終更新日時が、「n」日より前なら真 |
-name pattern | ファイル名が「pattern」にマッチするなら真。「pattern」はシェルのパス名展開と同じ。 |
-iname pattern | -nameと同じだが大文字小文字の区別をしない |
-path pattern | パス名が「pattern」にマッチするなら真。「pattern」はシェルのパス名展開と同じ |
-ipath pattern | -path と同じだが大文字小文字の区別をしない |
-regex pattern | ファイル名が「pattern」にマッチするなら真。「pattern」はEmacsの正規表現(BREに一部EREが追加されたもの) |
-iregex pattern | -regex と同じだが大文字小文字の区別をしない |
-type c | ファイルの種類が「c」なら真。通常のファイルは「f」、ディレクトリは「d」、など。 |
-user name | ファイルの所有者が「name」なら真。 |
-group name | ファイルの属するグループが「name」なら真。 |
expr1 -a expr2 | 「expr1」と「expr2」の両方が真なら真。「-a」は省略可能。 |
expr1 -o expr2 | 「expr1」か「expr2」のどちらかが真なら真。「expr1」が真なら「expr2」は評価しない |
!expr | 「expr」が偽なら真 |
続いて、処理に関するオプションです。
オプション | 意味 |
---|---|
ファイル名(パス)を一行に1つずつ出力(デフォルト) | |
-print0 | ファイル名(パス)をヌル文字で区切って出力(xargsコマンド用) |
-ls | 「ls -l」と同等の形式で出力 |
-exec command {} + | 「command」を実行(「{}」はファイル名に置き換わる) |
-delete | ファイルを削除 |
上記にオプションの詳細やそれ以外のオプションについて知りたい方は、ぜひオンラインマニュアル(「man find
」と実行)を確認してみてください。
find:ファイルやディレクトリを検索する
tailコマンドは、ファイルの終わり部分を表示するコマンドです。
基本的な使用方法は以下のとおりです。
$ tail [オプション] [ファイル名]
オプションを指定しない場合は、tailコマンドで指定したファイルの末尾は通常10行表示されます。
tailコマンドで表示する行数は、-n
オプションで-n 行数
または-行数
と指定します。
たとえば-n 1
または-1
と指定した場合は、ファイルの末尾1行のみを表示する、という具合です。
$ tail -n 1 file1
上記コマンドでは、ファイル「file1」の末尾1行のみを示すよう指示しています。
またtailコマンドとは逆にファイルの先頭部分を表示するheadというコマンドもあります。
こちらもデフォルトでは先頭10行を表示しますが、行数を指定したい場合は-n
オプションで指定することができます。
$ head -n 1 file
上記コマンドは「file1」の先頭1行を表示するという意味です。
ログの出力やデータ収集などで常時追記されていくファイルを表示する際に、追記されるたびにその内容を表示してファイルを監視したい場合があります。このようなケースでは、tailコマンドの-f
オプションを利用します。
これにより、ファイルの内容が書き換えられると、その都度リアルタイムに表示がされるようになります。次の例では、file1というファイルへの追記を監視しています。
$ tail -f file1
←ここでカーソルが止まる
上の図のように-f
オプションをつけてtailコマンドを実行すると、コマンドは終了せずにカーソルが止まったように見えます。この状態で別のターミナルからfile1へ「Hello」という文字を入力してみると…
$ tail -f file1
Hello ←ファイルへの追記内容が表示された
←再びここでカーソルが止まる
と、このように、追記した内容が即座に表示されます。これがファイルの監視といい、Linuxの運用作業などでログファイルの監視によく使われる方法でもあります。
なお、-f
オプションをつけて実行したtailコマンドを終了するにはCtrl+c
を押します。
tail:ファイルの終わり部分を表示する
head:ファイルの先頭部分を表示する
ファイルモードを変更するchmodコマンドは、ファイルやディレクトリのパーミッションを設定する際に使用します。
このファイルのパーミッションは、そのファイルのオーナーか、管理者権限を持つスーパーユーザしか変更することはできません。スーパーユーザ(またはrootユーザ)は、あらゆる操作が許された強い権限を持つユーザのことです。誰でもパーミッションを変更できてしまうと、パーミッションで操作を禁止する意味がなくなってしまうからです。
chmodコマンドの詳しい説明に移る前に、先ほどから頻出しているパーミッション、オーナーについて先に説明をしておきたいと思います。
ファイルのパーミッション
1つ1つのファイルには、「誰に、どのような操作を許可するか」という権限を規定する情報が設定されています。この情報のことを、パーミッションと呼びます。
ファイルのパーミッションは、lsコマンドにオプションをつけて詳細表示をすることで目視で確認することができます。
試しにcatコマンドの実体ファイルである/bin/cat
ファイルでパーミッションの確認をしてみましょう。
以前にも軽く触れましたが、-l
オプションで表示される先頭の1文字はファイルタイプを表しています。
ファイルタイプは以下のようにいくつか種類があります。
ファイルタイプ | 意味 |
---|---|
– | 通常ファイル |
b | ブロックデバイス |
c | キャラクターデバイス |
d | ディレクトリ |
l | シンボリックリンク |
p | パイプ |
s | ソケット |
つまり、今回詳細を表示させた/bin/cat
ファイルのファイルタイプは「通常ファイル」ということになりますね。
ファイルタイプの後ろの9文字、rwxr-xr-x
の部分はファイルモードと呼ばれます。この部分がファイルのパーミッションを表しています。この9文字はrwx
、r-x
、r-x
というように3文字ごとに1つの塊になっていて、それぞれが「オーナー」、「グループ」、「その他のユーザ」に対するパーミッションを意味しています。
オーナー | グループ | その他のユーザ |
---|---|---|
rwx | r-x | r-x |
この中で、r
やw
といった記号は、許可されるファイルへの操作を意味しています。操作は「読み取り」、「書き込み」、「実行」と3つの種類があり、それぞれ「r」「w」「x」の記号でパーミッションが表現されています。
記号 | 意味 |
---|---|
r | ファイルの読み取り(read) |
w | ファイルへの書き込み(write) |
x | ファイルの実行(execute) |
– | 権限が許可されていない |
lsコマンドの-l
オプションでは、操作が許可されている場合は「r」「w」「x」という記号で許可内容が表示され、逆に許可がされていない場合は「–」が表示されるようになっています。
つまり先ほどの/bin/cat
ファイルは、以下のようなパーミッションが設定されているということが読み取れます。
ユーザ識別 | 読み取り(r) | 書き込み(w) | 実行(x) |
---|---|---|---|
オーナー | 許可 | 許可 | 許可 |
グループに所属するユーザ | 許可 | 禁止 | 許可 |
その他のユーザ | 許可 | 禁止 | 許可 |
このファイルはオーナーにしか書き込みの権限がありませんから、そのほかのユーザはファイルを上書きすることはできません。また、ユーザにも実行権限がついているため、誰でも実行は可能です。
ディレクトリのパーミッション
ファイルと同様に、ディレクトリにもパーミッションが設定されています。
lsコマンドでディレクトリのパーミッションを確認するには、-l
オプションに加えて、ディレクトリ自身の情報を表示する-d
オプションも使用します。
$ ls -ld directory1
drwxrwxr-x. 2 zomy zomy 6 7月 19 2:34 dir1
ディレクトリのパーミッション表示も、ファイルと同じく「r」「w」「x」という記号を利用しますが、それぞれの記号は次の表のように、ファイルの場合とは違った意味を持つため、注意が必要です。
記号 | 意味 |
---|---|
r | 読み取り:ディレクトリに含まれるファイル一覧の取得 |
w | 書き込み:ディレクトリの下にあるファイル・ディレクトリの作成・削除 |
x | 実行:ディレクトリをカレントディレクトリにする |
– | 権限が許可されていない |
ディレクトリのパーミッションに読み取り(r)が設定されている場合、そのディレクトリに含まれるファイル一覧が取得できます。読み取りが設定されていない場合は、次のようにlsコマンドがエラーとなりファイル一覧を取得することができません。
$ ls -ld directory2 ←ディレクトリdir2のパーミッションを確認
d-wx-wx–x. 2 zomy zomy 6 7月 19 12:53 dir2
$ ls directory2 ←ディレクトリdirectory2内のファイルを表示
ls : ディレクトリ dir2 を開くことができません : 許可がありません
ディレクトリのパーミッションに書き込み(w)が設定されている場合、そのディレクトリ下のファイルの作成・削除が行なえます。ファイルの削除ができるかどうかはディレクトリのパーミッションで決まり、ファイル自身のパーミッションは関係ないことに注意をしてください。
オーナー
またオーナーについても確認しておきましょう。
Linuxで扱われるファイルは、自分で作成したメモのテキストファイルから、システムが提供するライブラリや実行コマンドまで、すべてに所有者(オーナー)が設定されています。ファイルのオーナーは、ファイルへのアクセス権限を自由に設定することができます。
先ほどパーミッションを確認した/bin/cat
ファイルで、今度はファイルのオーナーを確認してみましょう。
上の図では、root
の文字が2つ並んでいますね。1つ目のroot
部分では「ファイルの所有者(オーナー)」を、2つ目のroot
部分では「ファイルが所属するグループ」を示してます。
つまりこの/bin/cat
ファイルは、「rootユーザがオーナーで、rootグループに所属」している、ということがわかりますね。
このオーナーというのは、原則的にファイルを作成したユーザがそのファイルのオーナーになります。
また上記ででてきた「グループ」とは、ユーザをまとめた集まりの名称です。ユーザは同時にいくつものグループに所属することができること、どのユーザも最低1つのグループに所属しなければいけないこと、新規ユーザ作成時に特に指定がなければ、ユーザはユーザ名と同一のグループに所属することは、頭の片隅にでも記憶しておくとよいでしょう。
さて、これまではファイルやディレクトリのパーミッション、そしてオーナーについて説明をしてきました。
ここからはついに本題であるchmodコマンドの説明に移っていきます。
chmodコマンドには「シンボルモード(またはシンボルモード)」による指定と「数値モード」による指定の2種類の方法があり、どちらもよく使用されます。以下順番にこの2つの方法を見ていきましょう。
シンボルモード(シンボリックモード)
シンボルモード(シンボリックモード)は現在のパーミッションを基に変更する方法です。
シンボルモードによる基本的な書式は以下のとおりです。
$ chmod [u,g,o,a][+,-,=][r,w,x] [ファイル名]
シンボルモードによる指定は、「誰に、どのような権限を追加(もしくは禁止)するのか」というのが非常にわかりやすくなっています。
はじめの「誰に」の部分では、どのユーザに対するパーミッションを変更するのかを指定しています。それぞれの記号の意味は次のとおりです。
記号 | 意味 |
---|---|
u | オーナー(所有者) |
g | グループ |
o | その他のユーザ |
a | ugoすべて |
なおユーザ指定を省略すると、a
を指定したものとみなされます。
その次の「どうする」の部分は、権限を追加または禁止するのか操作を表しています。
記号 | 意味 |
---|---|
+ | 権限を追加する |
– | 権限を禁止する |
= | 指定した権限と等しくする |
最後の「何を」の部分はls -l
コマンドの出力で表示されたものと同じく「読み取り」「書き込み」「実行」「無許可」というそれぞれのパーミッションを意味しています。
記号 | 意味 |
---|---|
r | 読み取り(read) |
w | 書き込み(write) |
x | 実行(execute) |
– | 許可されていない/無許可 |
では、シンボルモードでのパーミッション設定例を見てみましょう。次のコマンドでは+
を利用して、file1.txtというファイルに対してオーナーのオーナーの書き込み権限を追加していきます。
$ chmod u+w file1.txt
この結果として、file1.txtファイルのパーミッションが元々は「r–rw-r–」であったとすると、「rw-rw-r–」に変更がされます。
コマンド実行 | オーナー | グループ | その他のユーザ |
---|---|---|---|
前 | r-- | r-- | r-- |
後 | rw- | r-- | r-- |
次のコマンドでは-
を利用してグループの書き込みを禁止していきます。
$ chmod g-w file2.txt
この結果として、file2.txtファイルのパーミッションが元々は「rw-rw-r–」であったとすると、「rw-r–r–」に変わります。元々はオーナーとグループに書き込み許可を与えていたファイルを、自分しか書き込めないように変更する、というケースでこのような操作を行います。
コマンド実行 | オーナー | グループ | その他のユーザ |
---|---|---|---|
前 | rw- | rw- | r-- |
後 | rw- | r-- | r-- |
複数のユーザをまとめて指定することもできます。次のコマンドでは=
を利用し、グループおよびその他のユーザに対するパーミッションを「読み取り」だけにしています。
$ chmod go=r file3.txt
この結果として、file3.txtファイルのパーミッションがもともとは「rwxrwxrwx」であったとすると「rwxr–r–」に変更されます。
コマンド実行 | オーナー | グループ | その他ユーザ |
---|---|---|---|
前 | rwx | rwx | rwx |
後 | rwx | r-- | r-- |
ここで紹介したシンボルモードは、相対的な指定方法です。つまり、指定したパーミッション以外が変化しません。これは「オーナー権限のみ」などパーミッションの一部だけを変更したいときに便利です。
数値モード
一方数値モードでは次のような書式になります。
$ chmod [8進数の数値] [ファイル名]
シンボルモードが相対的指定であったのとは逆に、数値モードは元のパーミッションに関わらず新しいパーミッションの値へと変更する、絶対指定の方法です。
パーミッションを数値で表現するには、rwxのうち許可する操作を、以下の表のとおりの数字に置き換えて、それを足し算します。
意味 | 数字 |
---|---|
読み取り(r) | 4 |
書き込み(w) | 2 |
実行(x) | 1 |
足した値を「オーナー」「グループ」「その他のユーザ」の順に3つ並べて指定します。この3桁の数字がパーミッションを指定するための値です。たとえば「rwxr-xr-x」というパーミッションは、数値に変換すると次のように「755」となります。
– | オーナー | グループ | その他のユーザ |
---|---|---|---|
パーミッション | r(4)w(2)x(1) | r(4)-(0)x(1) | r(4)-(0)x(1) |
パーミッション数値 | 4+2+1 | 4+0+1 | 4+0+1 |
数値の合計 | 7 | 5 | 5 |
chmodコマンドにこの755を指定することで、元のパーミッションがなんであれ、「rwxr-xr-x」というパーミッションに変更されます。
$ chmod 755 file.txt
$ ls -l file.txt
-rwxr-xr-x 1 zomy zomy 0 7月 19 13:02 file.txt
この755は、オーナーは読み書き実行が可能、その他のユーザは読み取りと実行が可能という状態です。他のユーザに見られてもよい実行可能ファイルは通常このパーミッションにします。
もう1つの例を見てみましょう。「rw-r–r–」というパーミッションはいくつになるでしょうか。
– | オーナー | グループ | その他のユーザ |
---|---|---|---|
パーミッション | r(4)w(2)-(0) | r(4)-(0)-(0) | r(4)-(0)-(0) |
パーミッション数値 | 4+2+0 | 4+0+0 | 4+0+0 |
数値の合計 | 6 | 4 | 4 |
上記のとおり、計算すると「644」になります。これはオーナーは書き込み可能、その他のユーザは読み取りだけ可能という状態です。他のユーザに見られてもよいファイルは、通常このパーミッションにします。
chmod(change mode):ファイルやディレクトリのパーミッションを設定・変更する
ファイルやディレクトリの所有者(オーナー)を変更するにはchownコマンドを、グループを変更するにはchgrpコマンドを使用します。
ファイルやディレクトリの所有者を変更するには、chownコマンドを以下のような形式で使用します。
$ chown [新しいユーザ名] [. 新しいグループ名] [ファイル名またはディレクトリ名]
上記では「.
」で新しいユーザ名と新しいグループ名をつなぎ、両方を指定することもできます。またユーザとグループの区切りに「:
」を使うことも可能です。
ユーザとグループを変更するには、rootユーザ、つまりroot権限を付与されている、なんでも書き換え可能なユーザである必要があります。このrootユーザはスーパーユーザとも呼ばれます。ディレクトリとファイルは区別なく変更できます。
$ chown zomy file
$ ls -l file
-rw-r–r– 1 zomy zomy 0 7月 19 12:49 file
上記例では、所有者も所有グループもzomyになっていますが、実際の環境ではコマンドを実行しているあなたのユーザとグループになります。
ファイルの所有グループを変更するにはchgrpコマンドを使って行います。
使用方法は以下のとおりです。
$ chgrp [新しいグループ名] [ファイル名またはディレクトリ名]
chgrpコマンドではグループが変更でき、ディレクトリとファイルは区別なく変更できます。
ここで、新しい所有者名
はファイルやディレクトリに設定したい新しい所有者のユーザー名またはユーザーIDを指定します。ファイル名またはディレクトリ名
は、所有者を変更したい対象のファイル名またはディレクトリ名を指定します。
例えば、以下のコマンドはfile.txt
というファイルの所有者をnewuser
に変更します。
$ chgrp newuser file.txt
chgrpコマンドも、通常はスーパーユーザー(root権限を持つユーザー)が使用します。一般のユーザーがファイルやディレクトリの所属グループを変更できる場合もありますが、一般的には制限されています。
chgrpコマンドはchownコマンドと異なり、所有者を変更するのではなく、所属グループを変更することに注意してください。ファイルやディレクトリのアクセス権限は所有者と所属グループの両方によって制御されます。したがって、適切なファイルの所有者と所属グループを設定することで、適切なアクセス制御を行うことができます。
chownコマンドの実行には管理者権限が必要です。chgrpコマンドの場合は、自分が属するグループへの変更なら管理者権限は不要ですが、他グループへの変更の場合はやはり管理者権限が必要となります。
chown(change owner):ファイルやディレクトリの所有者(オーナー)を変更する
chgrp(change group):グループを変更する
現在動作しているプロセスを表示するには、psコマンドを使用します。psコマンドのみでコマンドの実行をすると、現在のターミナルで実行しているプロセスだけを表示することになります。
この「プロセス」とはメモリ上で実行状態にあるプログラムのことを指しています。
シェルからコマンドを実行すると、Linuxカーネルはディスクから実行ファイルを読み出してメモリに格納し、そのメモリ内容に従ってCPUがプログラムを実行します。
この実行中のプログラム1つ1つのことをプロセスと呼び、この実行中のプロセスを表示するのがpsコマンドなのです。
またこの1つ1つのプロセスを区別するために、プロセスごとにLinuxカーネルが番号を振ってくれています。この番号のことを「プロセスID」と呼びます。
$ ps
PID TTY TIME CMD
3007 pts/0 00:00:00 bash
3034 pts/0 00:00:00 ps
上の例では、はじめのPIDというカラムがプロセスID、CMDというカラムが実行されているプロセスです。ここでは、プロセスIDが3007のbashと、3034のpsという2つのプロセスが動作しています。bashは現在実行しているシェル、psは今まさに実行したpsコマンドです。
このpsコマンドで出力される主な情報を下記表に示します。端末エミュレーターというアプリケーションやSSHでログインした場合は「pts/数値」、仮想コンソールの場合は「tty数値」です。
名前 | 意味 |
---|---|
USER または UID | ユーザ |
PID | プロセスID |
PPID | 親プロセスのID |
%CPU または C | CPUの使用率 |
%MEM | 物理メモリの使用率 |
VSZ | 仮想的に使用しているメモリ一覧 |
RSS | 実際に使用している物理メモリ一覧 |
TTY | 端末デバイス |
STAT | プロセスの状態 (「R」は実行可能/実行中、「S」は待機状態、「T」は停止状態など) |
STIME または START | コマンドを実行開始した時刻 |
TIME | CPUの実行時間 |
COMMAND または CMD | コマンド名 |
Linuxのpsコマンドにはさまざまなオプション形式がありますが、大きく分けると次の3種類が代表的です。
- UNIXオプション:最初に「-」をつけてオプションを指定します。
- BSDオプション:最初に何もつけずにオプションを指定します。
- GNUオプション:最初に「–」をつけてオプションを指定します。
それぞれ併用できるオプションもあれば、できないオプションもあります。ここでは特に区別せず、よく使う代表的なオプションを紹介していきます。
オプション | 意味 |
---|---|
x | psコマンドを実行したユーザのプロセスすべてを表示する |
u | プロセスの詳細情報を表示する |
ux | psコマンドを実行したユーザのプロセスすべてを、詳細情報を合わせて表示する |
-p またはp プロセスID | 指定したプロセスの情報を確認する |
ax | すべてのユーザのプロセスを表示する |
aux | すべてのユーザのプロセスを、詳細情報を合わせて表示する |
auxww | auxオプションで、コマンドラインが長くターミナルの右端が切れてしまう際に、表示幅を制限せずすべて表示する |
ほかにも多くのオプションがありますので、ぜひ調べてみてください。
ps(process status):現在ターミナル上で実行中のプロセスをリストを表示する
コマンドを誤って実行してしまったり、プログラムの不具合などによってコマンドが操作を受け付けなくなった場合には、シェルからコマンドを終了させる必要があります。複数のプロセスがひと塊になっているものをジョブと呼びますが、そのジョブやプロセスを終了するための操作方法を、ここから見ていきましょう。
ジョブを終了させるのは、そのジョブの状態により操作が変わってきます。
フォアグラウンドジョブを実行中の場合は、キーボードの入力待ちになっていますから、終了するにはそこでCtrl + c
を押します。多くのプログラムはCtrl + c
を押すことで終了するように設計されているためです。
次の例では、誤って実行したcpコマンドをCtrl + c
で終了しています。
$ cp file1 file2
^C ←Ctrl+cを入力
$ ←終了してシェルに戻った
一方バックグラウンドジョブはキーボード入力を受け付けておらず、よってCtrl + c
で終了させることができません。そのためバックグラウンドジョブを終了させるには、ジョブ番号を指定してkillコマンドを使います。
$ kill % [ジョブ番号]
たとえば、ジョブ番号が1番のジョブを終了したいとします。その場合は以下のようなコマンドになります。
$ kill %1
[ 1 ] Terminated man bash
ジョブを終了させることができると、上記のように「Terminated」というメッセージが表示されます。なお環境によっては、日本語で「終了しました」と表示されます。
またプロセスを終了させるには、バックグラウンドジョブの終了と同様にkillコマンドを使います。
$ kill [プロセスID]
プロセスの場合は、%をつけずにプロセスIDをそのまま指定します。
次の例では2つのターミナルで作業をしており、片方のターミナルでは他ファイルを閲覧している状態です。
$ kill 4649
これでプロセスID 4649のプロセスが終了します。
なお、他人のプロセスを勝手に終了させることができないように、プロセスを終了できるのはその実効ユーザのみとなっています。ただし、スーパーユーザはすべてのユーザのプロセスを終了させることができます。
シグナル
これまで「killコマンド」=「Ctrl+c
」のような説明をしてきましたが、実はその2つは厳密には同じではありません。
killコマンドはジョブ(つまり複数のプロセス、プロセスのひと塊)に「シグナル」を送るためのコマンドです。
killコマンドでシグナルを送信する場合は、下記のような方式をとります。
$ kill –[シグナル名]
このシグナルとは、一時停止や終了などの重要な振る舞いをプロセスに促すための信号のことで、シグナルにはさまざまな種類がありますが、シグナル名を省略して送信すると、デフォルト値として設定されているTERMというシグナルを送信することを意味します。
つまり、次の2つは同じ意味ということです。
$ kill 4649
$ kill -TERM 4649
またそれそれのシグナルには番号がついており、killコマンドではこのシグナル番号で指定しても同じ意味になります。TERMシグナルの番号は15のため、下記もまた上記2つの例と同じ挙動を意味します。
$ kill-15 4649
ここで登場したTERMというシグナルは「Terminate」つまり終了を意味しています。このため、シグナルを特に指定することなくkillコマンドを実行した場合は、デフォルトに設定されているTERMシグナルの信号が送信され、ジョブ・プロセスが終了したわけです。
またこれまでご紹介したCtrl+c
も、実はシグナルを送信するための操作です。Ctrl+c
はINTというシグナルを送信します。INTは「強制終了」を意味するシグナルですから、Ctrl+c
を実行するとジョブが強制終了されるのです。
システムで使用することができるシグナル一覧はkillコマンドに-l
をつけ実行することで確認することができます。
その主なシグナルを以下に一覧として記載します。なお、各シグナル名の先頭についている”SIG“はシグナルを意味する接頭辞です。
シグナル名 | 番号 | 意味 |
---|---|---|
SIGHUP | 1 | 端末エミュレーターなどの終了 |
SIGNIT | 2 | Ctrl+c キーを押したときの強制終了 |
SIGKILL | 9 | 強制終了 |
SIGSEGV | 11 | 不正なメモリーアクセス |
SIGALRM | 14 | 設定した時刻に送られるタイマーシグナル |
SIGTERM | 15 | 終了(killコマンドのデフォルト) |
SIGCONT | 18 | 実行再開 |
SIGTSTP | 20 | Ctrl+Z キーを押したときの一時停止 |
このシグナルの実体は番号の方なのですが、ユーザが扱いやすくするために名前がつけられているのです。
上記のうち、9番の「SIGKILL」は例外的なシグナルです。このシグナルだけはプロセスに渡されることなく、直接Linuxカーネルが処理を行います。KILLシグナル(SIGKILL)はTERMシグナル(SIGTERM)を受け付けなくなった異常プロセスを問答無用で強制終了するために用いられるのです。
ただしKILLシグナル(SIGKILL)は、あくまでも最終手段として使用するようにしてください。
プログラムの種類によっては、TERMシグナル(SIGTERM)を受信したときに現在の状態を保存したり、一時ファイルを削除したりといったように、必要な処理を行ってから終了するものがありますが、KILLシグナル(SIGKILL)はあくまでも強制的終了を目的としているため、そうした必要な処理を行うことなくプロセスが終了してしまうのです。
そのためkillコマンドでプロセスを終了させる場合は、まずはじめにTERMシグナル(SIGTERM)を試し、それでもうまく終了できない場合のみKILLシグナル(SIGKILL)を使用するよう、慎重に実行するようにしてください。
killコマンド:(ジョブに「シグナル」を送る=)ジョブ・プロセスを終了させる
ここまで多くの主要なLinuxコマンドを解説してきましたが、Linuxにはまだまだ多くのコマンドが用意されています。
そうした、ここではご紹介しきれなかったコマンドを調べる際には、Linuxシステムに用意されている使い方説明を確認することを強くオススメします。
実はLinuxシステム自体に「ヘルプ機能」や「マニュアル機能」が用意されているため、コマンドの使用方法をいちいちすべて暗記しておかなくても、調べ方さえ知っておけば必要に応じていつでも情報を参照することができます。そのうえ、その情報はLinuxから提供されるわけですから、ネットで検索をかけるよりより確実な情報を得ることができます。
–helpオプション
多くのLinuxコマンドには--help
というオプションが用意されています。このオプションを使用すると、コマンド自身のヘルプをメッセージ形式で表示してくれます。
次の画像はcatコマンドで--help
オプションを指定したものです。
![](https://zomy-blog.com/wp-content/uploads/2023/07/31b60d6ede14a20e6471f846bd892746-1024x382.png)
上の画像はヘルプメッセージの途中までのものです。
表示されるメッセージの長さや内容などはコマンドによって異なりますが、おおよそ以下の内容で構成されています。
- 使用方法
- コマンドの概要
- 利用可能なオプションの一覧とその意味
- その他の参考資料の紹介
このオプションはコマンド名さえ知っていれば容易に確認ができるため、頻繁に利用されています。初めて使用するコマンドは、–helpオプションを指定し概要を理解しておくと、作業がスムーズに進むでしょう。
manコマンド
manコマンドは、指定したコマンドのオンラインマニュアルを画面に表示するコマンドです。ここで指しているオンラインマニュアルとは電子化されたマニュアルのことで、ネット上にあるマニュアルをwebブラウザ上で確認するという意味ではありません。
manコマンドはLinuxにおいてもっとも基本的なマニュアルであり、また歴史も古く、ほとんどのコマンドにはmanによるマニュアルが用意されています。
manコマンドで表示したマニュアルには、先ほどご紹介した--help
オプションよりもより詳細な情報が記載されているため、コマンドをしっかりと深く理解したい場合はこちらのコマンドの使用をオススメします。
またmanには各コマンドについてのマニュアルだけでなく、Linuxの設定ファイルやライブラリなどに関するマニュアルも用意されています。
基本的な使用方法は以下のとおりです。
$ man [確認したいコマンド名]
実際にmanコマンドを使用しでcatコマンドのマニュアルも確認してみましょう。
![](https://zomy-blog.com/wp-content/uploads/2023/07/ca98b941e5f828136ae088fdc21f05b5-1024x547.jpg)
![](https://zomy-blog.com/wp-content/uploads/2023/07/599f75c9a50d1c4b7e8d7d136fa93f7e-1024x563.jpg)
![](https://zomy-blog.com/wp-content/uploads/2023/07/11f1dfc182793a92bfdd1976aa36c1d3-1024x557.jpg)
上記画像がマニュアルの全容ではありませんが、ここまでの内容でも--help
コマンドよりもより詳細な内容が記載されていることが確認できるかと思います。
manコマンドで確認できる内容はさまざまですが、おおよその内容は以下一覧のとおりです。
項目 | 内容 |
---|---|
名前 | コマンド名と簡単な説明 |
書式 | オプションや引数の指定方法 |
説明 | コマンドの詳細説明 |
オプション | 利用可能なオプション一覧とその使用方法 |
例 | 代表的な使い方の例 |
環境変数 | 動作を変更するための変数について |
ファイル | 設定ファイルや関連するファイルについて |
関連項目 | 関係のある、または動作が似ているコマンドについて |
バグ | 不具合に関する情報 |
webやネット上であたる資料とmanコマンドで表示されるマニュアルに食い違う部分があった場合は、ぜひmanコマンドから提供された情報を信用するのが原則です。使用しているディストーションによる差異かもしれませんし、アップデートによって書き換えられた情報かもしれないため、常に最新であるmanマニュアルを頼りにするようにしてください。
–help:簡単な使い方やオプションの一覧を表示する
man(manual):コマンドやシステムのマニュアル(ヘルプドキュメント)を閲覧する
ここまで、基本ソフトウェア/応用ソフトウェアから始まる「Linuxの前提知識」、「Linuxの歴史や構造」、そして「Linuxの主要コマンド」についてざっとご説明してきましたが、いかがでしたでしょうか?
「はじめに」でも述べたように、Linuxは大変奥が深い分野のためこの記事1本ですべての知識を網羅するというのは現実的ではありません。ですが「Linuxってよく耳にするけど、一体なんのことなの?」という初学者の方が、Linuxの専門書を手に取るまでの足がかり的基礎知識部分は、この記事でひととおりご説明できたのではないかと思います。
特に後半でご紹介したLinuxコマンドは、ご紹介した他にも膨大な数のコマンドがLinuxには用意されています。
そのためぜひLinuxを使いながら、Linuxシステム自身に含まれている使い方の説明を確認しつつ、これからの学習を進めていただければと思います。
そして本記事を書くために勉強・参考にさせていただいた書籍、動画を下記にてご紹介をさせていただいています。
では以上、長くなりましたがここまでお付き合いいただきまして、誠にありがとうございました。
本記事がどなたかの学習の一助になりましたら、幸いです。