Linuxコマンドライン:シェルを制する開発者の思考法

現代のソフトウェア開発において、グラフィカルユーザーインターフェース(GUI)の洗練度は日々向上しています。しかし、その裏側で、サーバー管理、開発環境の構築、自動化、そして日々の細かなタスクに至るまで、開発の根幹を支えているのは今も昔も変わらず、黒い画面に白い文字が流れる「コマンドラインインターフェース(CLI)」、すなわちシェルです。多くの初学者にとって、このCLIは無機質で、取っ付きにくい壁のように感じられるかもしれません。しかし、それは大きな誤解です。Linuxのコマンドラインは、単なるツールの集合体ではありません。それは、数十年にわたって磨き上げられてきた「思想」であり、開発者の思考を直接的にシステムに反映させるための、最も強力で柔軟な言語なのです。

この記事では、単に「知っておくべき20のコマンド」をリストアップし、その使い方を解説するだけに留まりません。もちろん、lscdgrepといった基本的なコマンドは扱います。しかし、私たちの真の目的は、それらのコマンドがどのような思想(Unix哲学)のもとに生まれ、それらを組み合わせる(パイプライン)ことで、いかにして複雑な問題をエレガントに解決できるのか、その「思考法」そのものを探求することにあります。サーバーのログファイルから特定のエラーを瞬時に抜き出す、大量のファイル名を一括で変更する、リモートサーバー上のアプリケーションをデプロイする――。これらの作業は、GUIツールを使えば数分、あるいは数十分かかるかもしれませんが、シェルを自在に操る開発者にとっては、ほんの数秒の出来事です。この記事を読み終える頃には、あなたにとって黒い画面はもはや恐怖の対象ではなく、あなたの思考を加速させる、信頼すべき相棒となっていることでしょう。

第一章:航海の始まり - ファイルシステムという大海原

開発者としての旅は、多くの場合、ファイルやディレクトリを操作することから始まります。ソースコード、設定ファイル、ログデータ、ドキュメント。これらはすべてファイルシステムの広大な海に浮かぶ島々です。まずは、この海を自在に航海するための基本的な羅針盤と海図、すなわちコマンドを手に入れましょう。

1. `pwd` (Print Working Directory) - 現在地の確認

大海原で自分の船がどこにいるかを知るのが最も重要であるように、ファイルシステムで作業する上で、自分が今どのディレクトリにいるのか(カレントディレクトリ)を正確に把握することは、すべての操作の基本です。pwdコマンドは、そのための最もシンプルかつ重要なコマンドです。実行すれば、ルートディレクトリ(/)から始まる現在のディレクトリの絶対パスを表示してくれます。


$ pwd
/home/username/projects/webapp

この一行の出力は、あなたが今、「ルートディレクトリの下のhomeディレクトリ、その中のusernameディレクトリ、さらにその中のprojects/webappという場所にいますよ」と教えてくれているのです。単純ですが、スクリプトを書く際や、複雑なディレクトリ構造の中で作業する際には、この「現在地の確認」が混乱を防ぐ生命線となります。

2. `ls` (List) - 周囲の島々(ファイルとディレクトリ)を眺める

現在地がわかったら、次はその周りに何があるのかを知りたくなります。lsコマンドは、カレントディレクトリに存在するファイルやサブディレクトリの一覧を表示します。最も頻繁に使われるコマンドの一つであり、多くの「オプション」を付けることで、その表示方法を多彩に変化させることができます。


$ ls
README.md  node_modules  package.json  src  yarn.lock

しかし、これだけでは情報が足りません。開発者が本当に知りたいのは、ファイルの種類、権限(パーミッション)、所有者、サイズ、最終更新日時といった詳細な情報です。ここで-l(long format)オプションの出番です。


$ ls -l
total 12
-rw-r--r-- 1 username staff  1024 Oct 28 10:15 README.md
drwxr-xr-x 1 username staff   512 Oct 28 09:30 node_modules
-rw-r--r-- 1 username staff  2048 Oct 28 09:30 package.json
drwxr-xr-x 1 username staff   256 Oct 28 11:00 src
-rw-r--r-- 1 username staff  4096 Oct 28 09:30 yarn.lock

この出力は情報の宝庫です。最初の文字(-はファイル、dはディレクトリ)から、パーミッション(rwx)、所有者(username)、ファイルサイズ、最終更新日時まで、一目で把握できます。さらに、-a(all)オプションを追加すれば、.(カレントディレクトリ)、..(親ディレクトリ)、そして.git.envのようなドット(.)で始まる隠しファイルやディレクトリも表示できます。ls -laは、開発者が無意識レベルで打ち込む、最も基本的な調査コマンドと言えるでしょう。

ここで、ディレクトリ構造を視覚的に表現してみましょう。

/home/username/projects/webapp/
├── README.md
├── node_modules/
│   ├── (たくさんのパッケージ...)
│   └── ...
├── package.json
├── src/
│   ├── index.js
│   └── components/
│       └── Button.js
└── yarn.lock

このような構造を頭に描きながら、次のcdコマンドで移動していく感覚を掴むことが重要です。

3. `cd` (Change Directory) - 目的の島へ移動する

周囲を見渡したら、次は目的地へ移動します。cdコマンドは、カレントディレクトリを変更するためのコマンドです。その使い方は直感的です。


# srcディレクトリへ移動
$ cd src

# 現在地を確認
$ pwd
/home/username/projects/webapp/src

# componentsサブディレクトリへ移動
$ cd components

# 現在地を確認
$ pwd
/home/username/projects/webapp/src/components

cdにはいくつかの便利なショートカットがあります。

  • cd ..: 一つ上の親ディレクトリへ移動します。上記の例で言えば、/home/username/projects/webapp/srcへ戻ります。
  • cd ~ または cd (引数なし): 自分のホームディレクトリ(上記の例では/home/username)へ一気に戻ります。どんなに深い階層にいても、一瞬で自分の「母港」へ帰還できます。
  • cd -: 直前にいたディレクトリへ戻ります。これは非常に便利で、二つの異なるディレクトリを頻繁に行き来する際に絶大な効果を発揮します。

pwd, ls, cd。この三つのコマンドを使いこなすことは、ファイルシステムという広大な世界を探検するための第一歩です。これらをスムーズに使いこなせるようになれば、あなたの作業効率は飛躍的に向上するでしょう。

第二章:創造と破壊 - ファイルとディレクトリの管理

航海術を身につけたら、次は新しい島を作ったり、不要なものを整理したりする段階です。開発プロジェクトは常に変化します。新しい機能のためにディレクトリを作成し、不要になった一時ファイルを削除する。これらの基本的な操作をコマンドラインから行う方法を学びます。

4. `mkdir` (Make Directory) - 新しい拠点を築く

プロジェクトに新しいコンポーネントや機能を追加する際、関連するファイルをまとめるための新しいディレクトリが必要になります。mkdirコマンドは、その名の通り、新しいディレクトリを作成します。


$ ls
index.js  components

$ mkdir pages

$ ls
index.js  components  pages

もし、複数の階層のディレクトリを一度に作りたい場合はどうでしょうか?例えば、pages/admin/dashboardという構造を作りたいとします。単純にmkdir pages/admin/dashboardと実行すると、pages/adminが存在しないためエラーになります。このような場合に、-p(parents)オプションが役立ちます。このオプションを付けると、必要な親ディレクトリもすべて自動的に作成してくれます。


$ mkdir -p pages/admin/dashboard

$ ls -R pages
pages:
admin

pages/admin:
dashboard

pages/admin/dashboard:

ls -Rは再帰的にサブディレクトリの内容も表示するオプションです。mkdir -pは、複雑なプロジェクト構造を初期化する際に非常に便利なコマンドです。

5. `touch` - 空のファイルを作成する、あるいは時間を更新する

新しいファイルを作成したいとき、最も簡単な方法がtouchコマンドです。指定した名前のファイルが存在しない場合は、中身が空のファイルを作成します。もし既に存在する場合は、そのファイルのタイムスタンプ(最終アクセス日時と最終更新日時)を現在の日時に更新します。


# 新しい設定ファイルを作成
$ touch config.js

$ ls -l config.js
-rw-r--r-- 1 username staff 0 Oct 28 12:30 config.js

# 少し待ってから再度touchを実行
$ touch config.js

$ ls -l config.js
-rw-r--r-- 1 username staff 0 Oct 28 12:31 config.js

タイムスタンプの更新機能は、ビルドシステムやMakefileなどで、ファイルの変更を検知する仕組みと連携して使われることがあります。開発の現場では、単に空ファイルを作る目的で頻繁に利用されます。

6. `cp` (Copy) - ファイルやディレクトリの複製

既存のファイルをテンプレートとして新しいファイルを作成したり、バックアップを取ったりする際にcpコマンドを使います。基本的な構文はcp [コピー元] [コピー先]です。


# 設定ファイルのバックアップを作成
$ cp config.js config.js.bak

$ ls
config.js  config.js.bak

ディレクトリを丸ごとコピーしたい場合は、-r(recursive)オプションが必要です。これにより、ディレクトリとその中に含まれるすべてのファイルやサブディレクトリが再帰的にコピーされます。


# srcディレクトリをsrc_backupとしてコピー
$ cp -r src src_backup

$ ls
config.js  config.js.bak  src  src_backup

この-rオプションは、後述するrmchmodなど、多くのコマンドで「ディレクトリを対象に再帰的に操作する」という意味で共通して使われる重要な概念です。

7. `mv` (Move) - ファイルやディレクトリの移動と名前変更

mvコマンドには二つの主要な機能があります。一つはファイルやディレクトリを別の場所へ移動すること、もう一つはファイルやディレクトリの名前を変更することです。Linux/Unixの世界では、「名前の変更」は「同じ場所への移動」として扱われます。


# ファイル名の変更
$ mv config.js settings.js

$ ls
settings.js  config.js.bak ...

# settings.jsを新しく作ったconfigディレクトリへ移動
$ mkdir config
$ mv settings.js config/

$ ls config/
settings.js

mvは非常に強力で、コピーと削除を一度に行うような動作をします。そのため、移動先に同名のファイルが存在する場合、警告なしに上書きしてしまうことがあります。-i(interactive)オプションを付けると、上書きする前に確認を求めるようになり、事故を防ぐことができます。多くのシステムでは、安全のためにmvmv -iのエイリアス(別名)として設定されていることもあります。

8. `rm` (Remove) - ファイルの削除

不要になったファイルを削除するのがrmコマンドです。このコマンドは非常に強力であり、一度削除したファイルは(特別なツールを使わない限り)元に戻すことはできません。そのため、使用には細心の注意が必要です。


$ rm config.js.bak

ディレクトリを削除したい場合は、-r(recursive)オプションが必要です。これにより、ディレクトリとその中身がすべて削除されます。


$ rm -r src_backup

警告: rm -rは非常に危険なコマンドです。特に、rm -rf /のようなコマンドは、システム全体を破壊する可能性があるため、絶対に実行してはいけません(-fはforceを意味し、警告を無視して強制的に削除します)。rmを使う前には、必ずpwdで現在地を確認し、lsで対象のファイルをリストアップして、自分が何を削除しようとしているのかを二重、三重に確認する癖をつけましょう。

第三章:テキストの錬金術 - データを自在に操る

開発者の仕事の多くは、テキストデータを扱うことです。ソースコード、ログファイル、設定ファイル(JSON, YAML)、CSVデータなど、すべてがテキストです。コマンドラインの真の力は、これらのテキストデータを巧みに、そして効率的に処理できる点にあります。ここでは、テキストを錬金術のように自在に操るためのコマンド群を見ていきましょう。これらのコマンドは、パイプ(|)で連結することで、その真価を最大限に発揮します。

9. `cat` (Concatenate) - ファイルの内容を覗き見る

catは、ファイルの内容を標準出力(通常はターミナル画面)に表示する最も基本的なコマンドです。短いファイルの内容をさっと確認したいときに非常に便利です。


$ cat package.json
{
  "name": "webapp",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  ...
}

その名の通り、複数のファイルを連結(concatenate)して表示することもできます。


$ cat file1.txt file2.txt > combined.txt

この例では、file1.txtfile2.txtの内容を連結し、リダイレクト(>)を使ってcombined.txtという新しいファイルに保存しています。しかし、catの本当の力は、他のコマンドとパイプで繋がれたときに発揮されます。

10. `grep` (Global Regular Expression Print) - 洪水中から砂金を探す

grepは、コマンドラインにおける最重要ツールの一つです。大量のテキストデータの中から、指定したパターン(文字列や正規表現)に一致する行だけを抽出してくれます。これは、巨大なログファイルから特定のエラーメッセージを探したり、プロジェクト全体から特定の関数がどこで使われているかを検索したりする際に、絶大な威力を発揮します。

シナリオ: あなたはWebサーバーを運用しています。ユーザーから「ページの表示がおかしい」と報告がありましたが、いつ発生したのかは不明です。サーバーのエラーログ(access.log)は数百万行にも及び、中にはステータスコード500(Internal Server Error)を示す致命的なエラーが記録されているはずです。このログファイルから、ステータスコードが500の行だけを抜き出してみましょう。


# access.logから " 500 " という文字列を含む行を検索
$ grep " 500 " access.log
192.168.1.10 - - [28/Oct/2025:14:20:11 +0900] "GET /api/data HTTP/1.1" 500 1234
192.168.1.25 - - [28/Oct/2025:14:22:05 +0900] "POST /api/submit HTTP/1.1" 500 1234
...

これだけで、数百万行の中から関連するエラー行だけを一瞬で絞り込むことができました。grepは多くの便利なオプションを持っています。

  • -i: 大文字と小文字を区別せずに検索します(case-insensitive)。
  • -v: 指定したパターンに一致「しない」行を表示します(invert match)。
  • -r: ディレクトリを指定すると、その中のファイルを再帰的に検索します(recursive)。grep -r "functionName" ./srcのように使えば、srcディレクトリ以下の全ファイルから関数名を検索できます。
  • -n: マッチした行の行番号を表示します(line number)。デバッグ時に非常に役立ちます。
  • -C [num]: マッチした行の前後(Context)[num]行も合わせて表示します。エラーの文脈を把握するのに便利です。

ここで、パイプの登場です。例えば、ps aux(後述)で現在実行中のプロセス一覧を表示し、その中からnginxに関連するプロセスだけを見たい場合、次のようにします。


$ ps aux | grep 'nginx'
root      1234  0.0  0.1  123456  7890 ?        Ss   Oct27   0:01 nginx: master process /usr/sbin/nginx
www-data  1235  0.0  0.2  123789  9876 ?        S    Oct27   0:10 nginx: worker process
...

ps auxの膨大な出力が、パイプ(|)を通ってgrepコマンドの入力となり、grepがそれをフィルタリングして、必要な情報だけを出力する。これがUnix哲学「一つのことをうまくやる小さなツールを組み合わせる」の真髄です。

11. `head` と `tail` - ファイルの最初と最後を覗く

巨大なファイルをcatで開こうとすると、ターミナルが一瞬で文字で埋め尽くされてしまいます。ファイルの内容を少しだけ確認したい場合に便利なのがheadtailです。

headはファイルの先頭部分を、tailはファイルの末尾部分を表示します。デフォルトではそれぞれ10行を表示します。


# ログファイルの先頭5行を表示
$ head -n 5 access.log

# ログファイルの末尾3行を表示
$ tail -n 3 access.log

tailの最も強力な機能は-f(follow)オプションです。これを付けて実行すると、ファイルの末尾を表示し続け、ファイルに新しい行が追記されると、それをリアルタイムでターミナルに表示してくれます。これは、サーバーのログをリアルタイムで監視する際に、なくてはならない機能です。


# access.logをリアルタイムで監視
$ tail -f access.log
(ここでサーバーにアクセスがあると、新しいログが次々と表示される)

この監視を止めたいときは、Ctrl + Cを押します。

12. `awk` と `sed` - テキスト処理の魔術師

grepがテキストの「検索」に特化しているのに対し、awksedはテキストの「加工」と「編集」における二大巨頭です。これらは非常に高機能で、それだけで一冊の本が書けるほどですが、ここでは開発者がよく使う基本的な機能に絞って紹介します。

`sed` (Stream Editor)

sedは、テキストストリーム(ファイルやパイプからの入力)に対して、置換、削除、挿入などの編集操作を行うコマンドです。最も一般的な用途は、文字列の置換です。

シナリオ: 設定ファイルconfig.yaml内で、APIのエンドポイントが古いドメインold-api.example.comを指しています。これを新しいドメインnew-api.example.comに一括で置換したいとします。


# 's/旧文字列/新文字列/g' という構文で置換
# -i オプションでファイルを直接編集(注意して使用)
$ sed -i 's/old-api.example.com/new-api.example.com/g' config.yaml

sは置換(substitute)、gは行内で見つかったすべての一致を置換(global)を意味します。-iオプションを付けずに実行すると、変更結果が標準出力に表示されるだけなので、まずはそれで結果を確認してから-iを付けて実行するのが安全です。

`awk`

awkは、テキストを行単位、そして各行をフィールド(列)単位で処理することに特化した、強力なプログラミング言語です。スペースやタブで区切られたデータ、例えばログファイルやCSVデータの処理に非常に適しています。

シナリオ: 先ほどのaccess.logから、ステータスコードが404(Not Found)だったリクエストの、リクエストされたパス(URL)だけを抜き出したいとします。Apacheの一般的なログフォーマットでは、リクエストされたパスは7番目のフィールドに記録されています。


# access.log から " 404 " を含む行を抽出し、
# その結果を awk に渡して、7番目のフィールド($7)を抜き出して表示する
$ grep " 404 " access.log | awk '{print $7}'
/non-existent-page.html
/images/missing.png
/old-resource
...

awk'{ ... }'の中に処理内容を記述します。$0は行全体、$1は1番目のフィールド、$2は2番目のフィールド...というように、フィールドを簡単に参照できます。この例のように、grepでフィルタリングし、awkで必要なデータ列を抽出するという組み合わせは、データ分析の常套手段です。

第四章:秩序の守護者 - パーミッションとプロセス管理

サーバーを安全かつ安定して運用するためには、誰がどのファイルにアクセスできるのか(パーミッション)を適切に管理し、意図しないプロセスが暴走していないか(プロセス管理)を監視する必要があります。ここでは、システムの秩序を守るためのコマンドを学びます。

13. `chmod` (Change Mode) - ファイルへのアクセス権を変更する

ls -lで表示される-rwxr-xr-xのような文字列は、ファイルのパーミッションを表しています。これは3つの権限(read, write, execute)が、3つの対象(user, group, others)に対してどのように設定されているかを示しています。

  • r (read): 読み取り権限 (数値: 4)
  • w (write): 書き込み権限 (数値: 2)
  • x (execute): 実行権限 (数値: 1)

例えば、シェルスクリプトを作成した場合、そのファイルに実行権限を与えないと、スクリプトとして実行することができません。


$ ls -l deploy.sh
-rw-r--r-- 1 username staff 256 Oct 28 15:00 deploy.sh

# スクリプトを実行しようとする
$ ./deploy.sh
-bash: ./deploy.sh: Permission denied

# 所有者(user)に実行権限(x)を追加(+)する
$ chmod u+x deploy.sh

$ ls -l deploy.sh
-rwxr--r-- 1 username staff 256 Oct 28 15:00 deploy.sh

# 再度実行
$ ./deploy.sh
(スクリプトが実行される)

パーミッションは数値で指定することも一般的です。r(4), w(2), x(1)の合計値で表現します。

  • 7: rwx (4+2+1)
  • 6: rw- (4+2)
  • 5: r-x (4+1)
  • 4: r-- (4)

したがって、chmod 755 deploy.shは、所有者にrwx (7)、グループとその他のユーザーにr-x (5)を与えることになり、-rwxr-xr-xと同じ意味になります。サーバーでWebコンテンツを公開する際など、ファイルのパーミッションを適切に設定することはセキュリティの基本です。

14. `chown` (Change Owner) - ファイルの所有者を変更する

chownは、ファイルやディレクトリの所有者やグループを変更するコマンドです。Webサーバー(例: Nginx, Apache)を運用する際、特定のファイルやディレクトリをWebサーバーの実行ユーザー(例: www-data)の所有にして、書き込み権限を与える必要がある場合などによく使われます。


# uploadsディレクトリの所有者をユーザーwww-data、グループwww-dataに変更
# -Rオプションでディレクトリ内も再帰的に変更
$ sudo chown -R www-data:www-data /var/www/html/uploads

このコマンドはシステムの所有権を変更するため、通常は管理者権限(sudo)が必要です。

15. `ps` (Process Status) - 動いているプログラムを調査する

システムで今何が動いているのかを知ることは、トラブルシューティングの第一歩です。psコマンドは、現在実行中のプロセスの一覧を表示します。


# 現在のターミナルで実行されているプロセスを表示
$ ps
  PID TTY          TIME CMD
 5432 pts/0    00:00:00 bash
 5678 pts/0    00:00:00 ps

これだけでは情報が少ないため、通常はオプションを付けて実行します。よく使われるのはauxという組み合わせです。

  • a: 自分以外のユーザーのプロセスも表示
  • u: ユーザー名やCPU/メモリ使用率など詳細情報を表示
  • x: ターミナルに接続されていないプロセス(デーモンなど)も表示

$ ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  16788  9380 ?        Ss   Oct27   0:02 /sbin/init
root         2  0.0  0.0      0     0 ?        S    Oct27   0:00 [kthreadd]
...
username  5432  0.0  0.1  23456  7890 pts/0    Ss   14:00   0:00 bash
...

この膨大な出力結果から、特定のプロセスを探すために、前述のgrepと組み合わせるのが定石です。


# nodeで実行されているプロセスを探す
$ ps aux | grep 'node'

16. `top` / `htop` - プロセスの活動をリアルタイムで監視する

psがスナップショットであるのに対し、topはシステムの状況をリアルタイムで、数秒おきに更新しながら表示してくれるコマンドです。どのプロセスがCPUやメモリを大量に消費しているのかを一目で把握できるため、サーバーのパフォーマンス問題を調査する際に非常に役立ちます。

topを起動すると、画面全体が監視インターフェースに切り替わります。CPU使用率順にプロセスが並んでいるため、「暴走」しているプロセスをすぐに見つけることができます。終了するにはqキーを押します。

もし、より直感的で高機能なツールを求めるなら、htopのインストールをお勧めします。htoptopの改良版で、カラー表示やマウス操作、プロセスのツリー表示などに対応しており、非常に使いやすくなっています。

17. `kill` - プロセスを強制終了させる

応答しなくなった、あるいは暴走してしまったプロセスを終了させるのがkillコマンドです。killはプロセスID(PID)を指定して、プロセスに「シグナル」を送ります。

シナリオ: topでPIDが9876のNode.jsプロセスがCPUを100%消費していることがわかりました。これを終了させたいとします。

まずは、穏便に終了を促すシグナル(TERM, シグナル番号15)を送ります。これはプロセスに「クリーンアップ処理をしてから終了してください」とお願いするものです。


$ kill 9876

しかし、プロセスがフリーズしていてこのシグナルに応答しない場合もあります。その場合は、より強制的な「強制終了」シグナル(KILL, シグナル番号9)を送ります。これは問答無用でプロセスを終了させます。


$ kill -9 9876

kill -9は最後の手段です。プロセスがファイルを書き込み中だった場合などにデータが破損する可能性があるため、まずはシグナル番号を指定しないkillを試すのがセオリーです。

第五章:世界と繋がる - ネットワークコマンド

現代の開発は、ネットワークと切り離して考えることはできません。リモートサーバーへの接続、APIとの通信、外部リソースのダウンロードなど、すべてはネットワークを介して行われます。ここでは、外部の世界と通信するための基本的なコマンドを紹介します。

18. `ssh` (Secure Shell) - リモートサーバーへの安全な扉

sshは、リモートにあるLinuxサーバーに、暗号化された安全な通信路を通ってログインし、そのサーバーのシェルを直接操作するためのコマンドです。クラウドサーバー(AWS EC2, Google Cloud, etc.)を管理する上で、必須のコマンドです。


# ユーザー名ubuntuで、IPアドレスが123.45.67.89のサーバーに接続
# -i オプションで秘密鍵ファイルを指定
$ ssh -i ~/.ssh/my-key.pem ubuntu@123.45.67.89

接続に成功すると、ローカルマシンのターミナルが、そのままリモートサーバーのターミナルになります。そこでlscdを実行すれば、リモートサーバー上のファイルシステムを操作していることになります。作業が終わったらexitコマンドで接続を切断します。

19. `scp` (Secure Copy) - リモートサーバーとの安全なファイル転送

scpsshの技術を利用して、ローカルマシンとリモートサーバー間で安全にファイルをコピーするコマンドです。cpコマンドのリモート版と考えることができます。

シナリオ: ローカルで開発したWebアプリケーションのビルド成果物(distディレクトリ)を、リモートサーバーの/var/www/htmlディレクトリにデプロイしたいとします。


# ローカルの dist ディレクトリをリモートサーバーに再帰的にコピー
$ scp -i ~/.ssh/my-key.pem -r ./dist ubuntu@123.45.67.89:/var/www/html/

逆に、サーバー上のログファイルをローカルマシンにダウンロードすることもできます。


# リモートのログファイルをローカルのカレントディレクトリ(.)にコピー
$ scp -i ~/.ssh/my-key.pem ubuntu@123.45.67.89:/var/log/nginx/error.log .

構文はscp [オプション] [コピー元] [コピー先]cpと似ていますが、リモートのパスはユーザー名@ホスト名:パスという形式で指定します。

20. `curl` と `wget` - Webリソースへのアクセス

curlwgetは、コマンドラインからHTTPリクエストを送り、Web上のリソースを取得するためのツールです。APIの動作確認や、ファイルのダウンロードなど、用途は多岐にわたります。

`curl` (Client for URLs)

curlは非常に高機能で、様々なプロトコルに対応しています。単純なGETリクエストから、ヘッダーを指定したPOSTリクエストまで、あらゆるHTTP通信をシミュレートできます。

シナリオ: 開発中のAPIエンドポイント(http://localhost:3000/api/users)が正しくJSONを返すかテストしたい。


$ curl http://localhost:3000/api/users
[{"id":1,"name":"Alice"},{"id":2,"name":"Bob"}]

レスポンスヘッダーも確認したい場合は-iオプション、POSTリクエストでデータを送りたい場合は-X POST-dオプションを使います。


$ curl -X POST -H "Content-Type: application/json" -d '{"name":"Charlie"}' http://localhost:3000/api/users

curlはAPI開発とデバッグの強力な味方です。

`wget`

wgetは、ファイルのダウンロードに特化したシンプルなツールです。URLを指定するだけで、そのファイルをカレントディレクトリにダウンロードしてくれます。


# WordPressの最新版をダウンロード
$ wget https://wordpress.org/latest.zip

大きなファイルのダウンロードが中断されても、-cオプションを付ければレジューム(途中から再開)してくれます。

終章:シェルとの対話 - あなただけの開発環境を育てる

ここまでで、開発の様々な局面で役立つ基本的なコマンドを学んできました。しかし、コマンドラインの旅はここで終わりではありません。むしろ、ここからが本当の始まりです。シェルは単にコマンドを実行するだけの場ではなく、あなた自身の作業スタイルに合わせてカスタマイズし、育てていくことができる「環境」です。

例えば、毎回ls -laと打つのが面倒なら、.bashrc.zshrcといったシェルの設定ファイルに、alias ll='ls -la'という一行を追加してみましょう。これにより、今後はllと打つだけでls -laが実行されるようになります。このような「エイリアス」を駆使することで、よく使う長いコマンドを劇的に短縮できます。

さらに、一連のコマンド操作をファイルにまとめて、再利用可能な「シェルスクリプト」を作成すれば、定型的な作業(テストの実行、ビルド、デプロイなど)を完全に自動化できます。

コマンドラインをマスターするということは、単に多くのコマンドを暗記することではありません。それは、Unix哲学という強力な思考モデルを身につけ、問題を小さな単位に分割し、それぞれを最適なツールで解決し、それらをパイプで繋ぎ合わせることで、複雑な課題をシンプルに解き明かす能力を養うことです。黒い画面は、あなたという開発者の思考を映し出す鏡であり、アイデアを現実世界に具現化するための、最もダイレクトでパワフルなキャンバスなのです。さあ、今日からあなたも、シェルとの対話を始めてみませんか。

Post a Comment