- 技術 💻
CLIとは?GUIとの違いを1万ファイルで実測|読み方と作り方
結論
CLI(コマンドラインインターフェース)は、文字でコマンドを打ってコンピューターを操作する方式です。マウスで画面を操作する GUI と比べて、同じ作業を何度でも同じ結果で繰り返せること、ほかの道具とつないで自動化できることが強みです。
この記事でわかること
- 100〜1万ファイルの名前変更・検索・集計をCLIで実測した時間と手数
- git・docker・gh の --help の実物で読む、コマンドの4つの部品
- 終了コード・エラー原文と、argparse で作る最小のCLI
CLI では、打った文字をシェル(コマンドを読み取る係)が分解し、OS にプログラムの実行を頼みます。結果は文字で返り、成功か失敗かは「終了コード」という数字で返ります。
flowchart TD
U[人が文字を打つ] --> S[シェルが単語に分ける]
S --> C[コマンドを実行]
C --> O[標準出力・標準エラー<br>結果とエラーの文字]
C --> X[終了コード<br>0 は成功]
O --> P[画面・ファイル・<br>次のコマンドへ]
よく調べられることの答えを先にまとめます。
| 知りたいこと | 答え | 詳しい節 |
|---|---|---|
| CLIとは | 文字のコマンドで操作する方式。Command Line Interface の略 | CLIとは |
| CLIとGUIの違い | GUI は見て選ぶ、CLI は打って指示する。CLI は記録・再実行・自動化に強い | CLIとGUIの違い |
| CLIは本当に速いのか | 100ファイルの名前変更は0.2秒、1万ファイルの検索と集計は0.09秒だった | 実測で比べる |
| CUI・TUI・シェル・ターミナルとの違い | CUI はほぼ同じ意味。TUI は文字で描く画面。シェルは解釈役、ターミナルは窓 | CUI・TUI・シェル・ターミナル |
| CLIの使い方(開き方) | Windows はターミナル、Mac は「ターミナル」、Linux は端末アプリを開く | CLIの開き方 |
| コマンドの読み方 | コマンド・サブコマンド・オプション・引数の4つに分けて読む | コマンドの読み方 |
| command not found と出た | 綴りの誤りか、入っていない・PATH に無い。終了コードは127 | よくあるエラー |
| CLIツールを作るには | Python なら argparse で、--help つきの CLI が30行で作れる | argparseで最小のCLIを作る |
確認環境:Ubuntu 24.04.5 LTS(カーネル 6.18)の上で、GNU bash 5.2.21・GNU coreutils 9.4・GNU grep 3.11・mawk 1.3.4・Python 3.13.18 を使い、作業場所(メモリ上の tmpfs)に Python で作った写真・ログ・売上 CSV の見本ファイルを 100・1,000・10,000 個ずつ置いて、名前変更・検索・集計を実行し、時間を time と date +%s.%N で測りました。コマンドの構造は git 2.43.0・Docker CLI 29.9.2(デーモンは起動せず、ヘルプの表示だけ)・GitHub CLI 2.89.0 の --help の実物で確かめ、外部のサービスには接続していません。AWS CLI はこの環境に入れられなかったため、AWS の公式ドキュメント(コマンドの構造・ヘルプの出し方)で書いています。GUI の手順は、Apple サポート(Finder の名前変更)と Microsoft Learn(PowerRename・Windows ターミナル)で確かめた範囲だけを書き、GUI の操作時間は測っていません。オプションの書き方の決まりは POSIX(IEEE Std 1003.1-2024)と GNU C ライブラリのマニュアルで確かめ、図は mermaid で描画を確かめています(確認日 2026年10月29日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「CLIとは?GUIとの違いを1万ファイルで実測|読み方と作り方」
CLIとは(意味と読み方)
この節では、CLI という言葉の意味、読み方、どんな場面で使われているかが分かります。
CLI は Command Line Interface(コマンドライン インターフェース)の略で、「シーエルアイ」と読みます。 画面に表示された入力待ちの記号(プロンプト。$ や >)の後ろに、1行の文字で命令(コマンド)を打ち、Enter キーで実行する操作の方式です。
$ ls photos
IMG_0001.JPG IMG_0002.JPG IMG_0003.JPG
この例では、$ がプロンプト、ls photos が人が打った部分、下の行がコンピューターの返事です。「photos フォルダーの中身を一覧にして」という指示を、マウスでフォルダーを開く代わりに文字で伝えています。
CLI が使われている場面
- 開発:Git でのバージョン管理、npm・pip でのライブラリの追加、テストやビルドの実行。
- サーバーの運用:画面の無い Linux サーバーに SSH で入って、ログを見る・設定を変える・再起動する。
- クラウド:AWS CLI・gcloud・az などで、画面(コンソール)と同じ操作を文字で行う。
- 自動化:CI/CD(自動テスト・自動デプロイ)は、CLI のコマンドを順に実行する仕組みです。
- AI の開発ツール:Claude Code など、ターミナルで動く AI のコーディングツールも CLI です。
「CLI」の別の意味
.NET の分野では、CLI が Common Language Infrastructure(共通言語基盤。ECMA-335 で決められた、複数の言語のプログラムを動かす土台)を指すことがあります。この記事の CLI は、すべて Command Line Interface の意味です。
CLIとGUIの違い(一覧表)
この節では、CLI と GUI の違いを、操作の仕方・覚えやすさ・自動化などの観点で一覧にしたものが分かります。
GUI(Graphical User Interface)は画面に並んだものを見て選ぶ方式、CLI は名前を知っているものを打って指示する方式です。 どちらが上というより、得意なことが違います。
| 観点 | GUI | CLI |
|---|---|---|
| 操作 | マウス・タッチでアイコンやボタンを選ぶ | キーボードでコマンドを打つ |
| はじめての人 | 見れば分かる。説明書なしでも使える | コマンドの名前を知らないと始められない |
| 同じ作業の繰り返し | 毎回同じ操作を手でする | コマンドを保存して再実行できる |
| 大量の処理 | 件数に比例して手数が増える | 1万件でもコマンドは同じ1行(手元で実測) |
| 記録・共有 | 手順書に画面の写真が要る | コマンドの文字をそのまま貼れる |
| 結果の見え方 | 画面で一目で分かる | 文字で返る。何も出ないこともある |
| 遠隔の操作 | 画面の転送が要り、通信が重い | SSH の文字のやり取りだけで済む |
| 間違えたとき | 確認の画面が出ることが多い | 確認なしで実行されるコマンドがある |
料理にたとえると
見分ける問い:「この作業を、もう一度・別の人が・同じようにするか」
同じ作業をGUIとCLIで比べる(100〜1万ファイルの実測)
この節では、ファイルの名前変更・検索・集計という同じ作業を CLI で実行した時間と手数、GUI での手順の数、そして「再現できるか」の違いが分かります。
手元で、写真100枚(IMG_0001.JPG〜)・ログ100個・売上 CSV 100個の見本を作り、次の3つを行いました。
- 名前変更:
IMG_0001.JPGをtrip_001.jpgの形にする(連番を3桁、拡張子を小文字)。 - 検索:100個のログのうち、
ERRORを含むファイルを探す。 - 集計:100個の CSV(日付・店舗・金額)を店舗ごとに件数と合計を出す。
CLI で打ったコマンド
実行する前に、mv の前に echo を付けて「何が起きるか」だけを表示させ(dry-run)、確かめてから本番を流しました。
$ for f in photos/IMG_*.JPG; do n=${f#photos/IMG_}; n=${n%.JPG}; echo mv -n "$f" "photos/trip_$(printf %03d $((10#$n))).jpg"; done | head -3
mv -n photos/IMG_0001.JPG photos/trip_001.jpg
mv -n photos/IMG_0002.JPG photos/trip_002.jpg
mv -n photos/IMG_0003.JPG photos/trip_003.jpg
$ time (for f in photos/IMG_*.JPG; do n=${f#photos/IMG_}; n=${n%.JPG}; mv -n "$f" "photos/trip_$(printf %03d $((10#$n))).jpg"; done)
real 0m0.199s
$ ls photos | head -3; ls photos | wc -l
trip_001.jpg
trip_002.jpg
trip_003.jpg
100
$ grep -l ERROR logs/*.log | wc -l
14
$ grep -l ERROR logs/*.log | head -3
logs/app_007.log
logs/app_014.log
logs/app_021.log
$ tail -q -n +2 sales/*.csv | awk -F, '{s[$2]+=$3; c[$2]++} END{for(k in s) printf "%s\t%d件\t%d円\n", k, c[k], s[k]}' | sort
新宿 170件 852111円
池袋 165件 798034円
渋谷 165件 858012円
$ awk '{print $2}' logs/*.log | sort | uniq -c | sort -rn
2000 INFO
300 WARN
14 ERROR
grep -l・14個が該当件数を増やしたときの時間(CLI)
3つの作業をまとめたスクリプト(後の節で中身を載せています)を、ファイル数を変えて流しました。
| ファイル数(各種類) | 3つの作業の合計時間 | 打ったコマンド |
|---|---|---|
| 100 | 0.21秒 | ./tidy.sh a100(14文字) |
| 1,000 | 2.09秒 | ./tidy.sh a1000 |
| 10,000 | 18.40秒 | ./tidy.sh a10000 |
| 10,000(名前変更を Python で) | 0.207秒 | python3 ren.py c10000 |
| 10,000(検索と集計だけ) | 0.094秒 | grep と tail・awk |
時間のほとんどは、名前変更で1ファイルごとに mv のプログラムを起動している分でした。 1万ファイルで18秒かかった名前変更は、1つのプロセスの中で名前を変える Python に替えると0.2秒になりました。CLI でも、道具の選び方で速さは90倍近く変わります。
GUI での手順(公式ドキュメントの範囲)
GUI の操作時間は測っていないため、公式の手順から操作の数を書きます。
| 作業 | GUI の道具と手順 | CLI |
|---|---|---|
| 名前変更(Mac) | Finder で項目を選ぶ→Control キーを押しながらクリック→「名前を変更」→「フォーマット」で名前と番号の付け方を選ぶ→「名前を変更」(Apple サポート) | 1行(123文字)か、スクリプト1回 |
| 名前変更(Windows) | PowerToys の PowerRename:エクスプローラーで選んで右クリック→検索と置換・正規表現・連番(${start=X}・${padding=X} など)を入れ、プレビューを見て実行(Microsoft Learn) |
同上 |
| 検索 | ファイルを開いて探す。100個なら100回開く | grep -l ERROR logs/*.log(24文字) |
| 集計 | 表計算ソフトで100個の CSV を開き、1つの表に貼ってから集計 | パイプ1行(102文字) |
名前変更のように、OS や道具に「まとめて変える」機能があれば、GUI でも数回の操作で済みます。 GUI が不利になるのは、まとめる機能の無い作業(100個のファイルの中身を探す・合わせて集計する)と、同じ作業を毎週・別の人がする場合です。
再現性:もう一度流すと同じ結果になるか
同じ見本を2つ作って、それぞれにスクリプトを流し、結果のファイル一覧・検索結果・集計表をまとめたハッシュ値を比べました。
n=100 a100: ddf9f7f1b9fe0e02 b100: ddf9f7f1b9fe0e02
n=1000 a1000: 1636ed2ec0e5836d b1000: 1636ed2ec0e5836d
n=10000 a10000: 9b9649f0e400ce56 b10000: 9b9649f0e400ce56
3通りとも一致しました。CLI の作業は「打った文字」がそのまま手順書になり、別の日・別の人が流しても同じ結果になります。 GUI の操作は、押した順番やチェックの付け忘れが記録に残りません。
1件数が増えてもコマンドは同じ
100でも1万でも、打つ文字は同じだった。増えるのは待ち時間だけ。
2CLI でも道具で速さが変わる
1ファイルごとに mv を起動すると1万件で18秒、Python なら0.2秒。
3同じ結果を何度でも出せる
2回流した結果のハッシュ値が一致した。手順の記録と共有が文字だけで済む。
CUI・TUI・シェル・ターミナルとCLIの違い
この節では、CLI と一緒に出てくる CUI・TUI・シェル・ターミナル・コンソールの違いが分かります。
CLI は「操作の方式」、シェルは「打った文字を読み取る係」、ターミナルは「文字を表示して入力を受け取る窓」です。 1つの画面の中で、この3つが一緒に動いています。
| 言葉 | 意味 | 例 |
|---|---|---|
| CLI | コマンドを1行ずつ打って操作する方式 | git status |
| CUI | Character User Interface。文字で操作する画面の総称で、日本ではCLIとほぼ同じ意味で使われる | CLI と同じ |
| TUI | Text User Interface。文字で画面全体を描き、キーで動かす画面 | vim・nano・top・less |
| シェル | 打った文字を解釈して、プログラムを起動する係 | bash・zsh・PowerShell・cmd |
| ターミナル | シェルの入出力を表示する窓(アプリ) | Mac の「ターミナル」・Windows ターミナル |
| コンソール | もとは機械に直接つながった操作卓。今はターミナルとほぼ同じ意味でも使う | サーバーの画面・ブラウザの開発ツールのコンソール |
TUI は CLI の中で動く「画面」
top は、そのまま起動すると画面全体を書き換えて動き続ける TUI ですが、-b(バッチ)を付けると1回分を文字で出して終わる CLI の形になりました。
$ top -b -n1 | head -4
top - 15:18:27 up 7 min, 0 user, load average: 0.39, 0.36, 0.15
Tasks: 78 total, 1 running, 77 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 4.8 sy, 0.0 ni, 95.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 8027.6 total, 5466.2 free, 1477.8 used, 1798.8 buff/cache
TUI は人が見るのに便利で、CLI の形は次のコマンドに渡したり記録したりするのに便利です。
シェルが自分で持っているコマンドもある
$ type ls cd
ls is /usr/bin/ls
cd is a shell builtin
ls は /usr/bin/ls という独立したプログラムですが、cd はシェルが自分で持つ「組み込みコマンド」でした。シェルの違い(bash と zsh)、ターミナルの種類と開き方の詳細は、関連記事「ターミナルとは|シェルとの違い・Mac/Windowsの開き方と最初の10コマンド」で扱っています。
CLIの開き方(Windows・Mac・Linux)
この節では、CLI を使うための窓(ターミナル)を、OS ごとにどう開くかが分かります。
CLI を使うには、まずターミナルのアプリを開きます。 手順は各社の公式ドキュメントで確かめた範囲です。
Windows:Windows ターミナルを開く
Microsoft Learn は、Windows ターミナルを「コマンド プロンプト、PowerShell、bash (Windows Subsystem for Linux (WSL) 経由) など」のシェルのためのホスト アプリケーションと説明しています。タブごとに PowerShell やコマンドプロンプトを選べます。
Mac:「ターミナル」を開く
Apple のターミナル ユーザガイドでは、Launchpad で「ターミナル」と入力して開く方法と、Finder で「/アプリケーション/ユーティリティ」フォルダの「ターミナル」をダブルクリックする方法が案内されています。既定のシェルは zsh です。
Linux:端末(ターミナル)のアプリを開く
デスクトップのある Linux では「端末」などのアプリを開きます。画面の無いサーバーでは、SSH でつないだ時点で CLI になっています。
最初の1行を打つ
どの OS でも、プロンプトの後ろに pwd(Windows の PowerShell でも使える)と打って Enter を押すと、今いるフォルダーの場所が返ります。終わるときは exit と打ちます。
Windows のコマンドプロンプトで使えるコマンドは関連記事「コマンドプロンプトの開き方・使い方|ショートカットとコマンド一覧・bash対応表」で、PowerShell は関連記事「PowerShellコマンド一覧|用途別50選とbash対応表・実行例付き」で扱っています。
コマンドの読み方(コマンド・サブコマンド・オプション・引数)
この節では、どんな CLI のコマンドでも同じように読める「4つの部品」と、git・docker・gh・aws の --help での見え方が分かります。
CLI のコマンドは、「コマンド」「サブコマンド」「オプション」「引数」の4つの部品でできています。
git commit -m "初回" README.md
─── ────── ───────── ─────────
コマンド サブコマンド オプション(+値) 引数
| 部品 | 役割 | 例 |
|---|---|---|
| コマンド | どのプログラムを動かすか | git・docker・ls |
| サブコマンド | そのプログラムの中の、どの機能を使うか | commit・container ls・pr list |
| オプション(フラグ) | 動き方を変える。- 1文字か -- 単語 |
-a・--all・-m "文" |
| 引数 | 何に対して行うか(ファイル名など) | README.md・photos |
git の --help
$ git --help
usage: git [-v | --version] [-h | --help] [-C <path>] [-c <name>=<value>]
[--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
[-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare]
[--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
[--config-env=<name>=<envvar>] <command> [<args>]
These are common Git commands used in various situations:
start a working area (see also: git help tutorial)
clone Clone a repository into a new directory
init Create an empty Git repository or reinitialize an existing one
work on the current change (see also: git help everyday)
add Add file contents to the index
mv Move or rename a file, a directory, or a symlink
...
1行目の usage: が書式です。最後の <command> [<args>] が「サブコマンドと、その引数」を意味し、下に使えるサブコマンドが目的別に並んでいます。サブコマンドの細かいオプションは git commit -h で出ます。
$ git commit -h
usage: git commit [-a | --interactive | --patch] [-s] [-v] [-u<mode>] [--amend]
[--dry-run] [(-c | -C | --squash) <commit> | --fixup [(amend|reword):]<commit>)]
[-F <file> | -m <msg>] [--reset-author] [--allow-empty]
...
-m, --[no-]message <message>
commit message
docker の --help
$ docker --help
Usage: docker [OPTIONS] COMMAND
A self-sufficient runtime for containers
Common Commands:
run Create and run a new container from an image
exec Execute a command in a running container
ps List containers
build Build an image from a Dockerfile
...
Management Commands:
container Manage containers
image Manage images
network Manage networks
volume Manage volumes
...
$ docker container ls --help
Usage: docker container ls [OPTIONS]
List containers
Aliases:
docker container ls, docker container list, docker container ps, docker ps
Options:
-a, --all Show all containers (default shows just running)
-f, --filter filter Filter output based on conditions provided
-q, --quiet Only display container IDs
docker は docker container ls のように「対象(container)+動作(ls)」の2段のサブコマンドを持ち、Aliases を見ると、よく使う docker ps は同じ機能の短い別名だと分かります。
gh(GitHub CLI)と aws(AWS CLI)
$ gh --help
Work seamlessly with GitHub from the command line.
USAGE
gh <command> <subcommand> [flags]
CORE COMMANDS
auth: Authenticate gh and git with GitHub
browse: Open repositories, issues, pull requests, and more in the browser
issue: Manage issues
pr: Manage pull requests
repo: Manage repositories
...
AWS CLI は、公式ドキュメントで構造が aws <command> <subcommand> [options and parameters] と説明されています。最初の command は多くの場合 AWS のサービス(s3・ec2 など)、subcommand は行う操作です。ヘルプは --help ではなく aws help・aws ec2 help・aws ec2 describe-instances help のように末尾に help を付けて出し、中身は Name・Description・Synopsis・Options・Examples・Output の6つに分かれています(AWS 公式)。
| CLI | 書式(usage) | ヘルプの出し方 |
|---|---|---|
| git 2.43 | git <command> [<args>] |
git --help・git commit -h |
| Docker CLI 29.9 | docker [OPTIONS] COMMAND |
docker --help・docker container ls --help |
| gh 2.89 | gh <command> <subcommand> [flags] |
gh --help・gh pr --help |
| AWS CLI | aws <command> <subcommand> [options] |
aws help・aws s3 help(公式) |
--help の記号の読み方
| 記号 | 意味 | 例 |
|---|---|---|
[ ] |
省略できる | [-a]:付けても付けなくてもよい |
< >・大文字 |
自分の値に置き換える | <path>・COMMAND |
| |
どれか1つ | -p | --paginate |
... |
繰り返して複数書ける | [<pathspec>...] |
--[no-] |
付けると有効、no- 付きで無効 |
--[no-]verbose |
-a, --all |
短い形と長い形が同じ意味 | -a と --all |
オプションの書き方の決まり
POSIX(IEEE Std 1003.1-2024)のユーティリティの書き方の指針は、オプションは - で始めること、値を取らないオプションはまとめて書けること、最初の -- は「ここでオプションが終わる」という区切りとして扱うことを挙げています。GNU C ライブラリのマニュアルは、長いオプションは -- の後ろに単語を書き、値は --name=value の形で渡す、と説明しています。手元で確かめた結果です。
$ ls -1a # -1 と -a をまとめて書いた
-n.txt
.
..
a.txt
$ ls -1 -a # 分けて書いても同じ
-n.txt
.
..
a.txt
$ cat -n.txt # 「-n.txt」というファイルがオプションと読まれた
cat: invalid option -- '.'
Try 'cat --help' for more information.
$ cat -- -n.txt # -- の後ろはオプションとして読まない
memo
$ cat ./-n.txt # ./ を付けても読める
memo
パイプとスクリプト化(CLIで自動化する)
この節では、CLI の一番の強みである「コマンドをつなぐ(パイプ)」と「コマンドをファイルに保存して流す(スクリプト)」が分かります。
パイプ(|)は、左のコマンドの出力を、右のコマンドの入力に渡す記号です。 1つ1つは小さな道具でも、つなぐと集計や絞り込みができます。
$ awk '{print $2}' logs/*.log | sort | uniq -c | sort -rn
2000 INFO
300 WARN
14 ERROR
- 1awk '{print $2}' logs/*.log100個のログの各行から、2番目の欄(INFO・WARN・ERROR)だけを出す
- 2sort同じ文字が並ぶように並べ替える
- 3uniq -c続いて並んだ同じ行を1つにまとめ、数を付ける
- 4sort -rn数の大きい順に並べる
スクリプトにして、何度でも流す
3つの作業を1つのファイル(シェルスクリプト)にまとめたのが、前の実測で使った tidy.sh です。
#!/usr/bin/env bash
# 使い方: ./tidy.sh <作業フォルダ>
set -euo pipefail
shopt -s nullglob
cd "$1"
# 1) 名前変更: IMG_0001.JPG -> trip_001.jpg
for f in photos/IMG_*.JPG; do
n=${f#photos/IMG_}; n=${n%.JPG}
printf -v new 'photos/trip_%03d.jpg' "$((10#$n))"
mv -n -- "$f" "$new"
done
# 2) 検索: ERROR を含むログ
grep -l ERROR logs/*.log > error_files.txt || true
# 3) 集計: 店舗ごとの件数と合計
tail -q -n +2 sales/*.csv |
awk -F, '{s[$2]+=$3; c[$2]++} END{for(k in s) printf "%s\t%d\t%d\n", k, c[k], s[k]}' |
sort > summary.tsv
echo "renamed=$(ls photos | grep -c '^trip_') errors=$(wc -l < error_files.txt)"
$ ./tidy.sh a100
renamed=100 errors=14
2回目に流したら起きたこと(nullglob の前)
最初は shopt -s nullglob の行が無い版で書いていました。同じフォルダーに2回目を流すと、次のエラー文が出ました。
$ ./tidy.sh a100
./tidy.sh: line 8: 10#: invalid integer constant (error token is "10#")
renamed=100 errors=14
$ echo $?
0
名前を変え終わった後は IMG_*.JPG に当たるファイルが無く、bash は photos/IMG_*.JPG という文字をそのまま1回ループに渡します。そこから番号を取り出そうとして失敗していました。しかも、set -e を付けていたのに終了コードは0で、スクリプトは最後まで進みました。 shopt -s nullglob(当たるファイルが無ければ0個として扱う)を足すと、2回目はエラー文なしで同じ結果を出しました。スクリプトは「2回流しても壊れないか」まで確かめておくと安心です。
パイプで受け取った一覧を、別のコマンドの引数として渡したいときは、関連記事「xargsの使い方とオプション一覧|-0・-I・-P並列をコピペ例で解説」で扱っています。
標準入力・標準出力・標準エラーと終了コード
この節では、CLI のプログラムが結果を返す3つの通り道と、成功・失敗を表す終了コードの読み方が分かります。
CLI のプログラムには、入力の口(標準入力)と、2つの出口(標準出力・標準エラー)があります。 結果は標準出力へ、エラーや進み具合の表示は標準エラーへ出すのが決まりで、パイプで次に渡るのは標準出力だけです。
標準出力(1番)
結果のデータ。パイプで次のコマンドへ渡る
> file でファイルへ保存
例:ls の一覧、grep の当たった行
標準エラー(2番)
エラー文・警告・件数などの知らせ
2> file で分けて保存、2>/dev/null で捨てる
パイプで渡しても画面に残る
$ ls 1>/dev/null nofile # 標準出力を捨てても、エラーは画面に出る
ls: cannot access 'nofile': No such file or directory
$ git commit -h >/dev/null # git の -h の書式は標準エラーに出た(画面に表示された)
usage: git commit [-a | --interactive | --patch] [-s] [-v] [-u<mode>] [--amend]
...
終了コード(終了ステータス)
コマンドは終わるときに、0〜255の数を返します。0は成功、0以外は失敗や「見つからなかった」などの意味です。 bash では直前の値が $? に入ります。手元で集めた値です。
| 実行したもの | 終了コード | 意味 |
|---|---|---|
| 成功したコマンド | 0 | 成功 |
grep -q hello s.sh(当たらない) |
1 | grep で「見つからなかった」 |
grep hello nofile |
2 | grep でエラー(ファイルが無い) |
ls --foo |
2 | 使い方の誤り(coreutils) |
| argparse の CLI に知らないオプション | 2 | 使い方の誤り(Python) |
docker ps --foo |
125 | docker 自身のエラー |
| 実行権限の無いスクリプト | 126 | 見つかったが実行できない |
gti status(綴りの誤り) |
127 | コマンドが見つからない |
git status --foo |
129 | git の使い方の誤り |
パイプでつないだときの $? は、いちばん右のコマンドの値です。途中の失敗は PIPESTATUS で見られます。
$ false | true; echo "PIPESTATUS=${PIPESTATUS[*]}"
PIPESTATUS=1 0
スクリプトの set -o pipefail は、この「途中の失敗」をパイプ全体の失敗として扱う設定です。終了コードの一覧と判定の書き方は、関連記事「シェルスクリプトの終了ステータス $?とexitコード一覧・判定方法」で扱っています。
端末かパイプかで、出力の形が変わる
同じ ls でも、画面(端末)に出すときは横に並べ、パイプに流すときは1行に1つずつ出しました。プログラムが「出力先が端末か」を見て形を変えているためです。
$ ls demo # 端末に出すとき
alpha.txt beta.txt delta.txt gamma.txt
$ ls demo | cat # パイプに流すとき
alpha.txt
beta.txt
delta.txt
gamma.txt
画面で見た形のまま次のコマンドに渡ると思い込むと、集計がずれます。パイプで受け取る側は「1行に1件」の形を前提にしてよい、ということでもあります。
Python argparseで最小のCLIを作る
この節では、自分で CLI ツールを作るときの最小の形と、--help・エラー・終了コードが自動で揃う様子が分かります。
Python の標準ライブラリ argparse を使うと、30行ほどで --help とエラー表示の付いた CLI が作れます。 写真の名前を連番に変える renamer を作りました。
#!/usr/bin/env python3
"""連番で名前を付け直す、最小の CLI"""
import argparse, pathlib, sys
def main(argv=None):
p = argparse.ArgumentParser(prog="renamer", description="フォルダー内のファイルを連番の名前に変える")
p.add_argument("folder", help="対象のフォルダー")
p.add_argument("-p", "--prefix", default="file", help="新しい名前の先頭 (既定: file)")
p.add_argument("-g", "--glob", default="*", help="対象にするファイルのパターン (既定: *)")
p.add_argument("-n", "--dry-run", action="store_true", help="変えずに、変えた後の名前だけ表示する")
p.add_argument("--version", action="version", version="renamer 1.0")
a = p.parse_args(argv)
d = pathlib.Path(a.folder)
if not d.is_dir():
print(f"renamer: '{d}' はフォルダーではありません", file=sys.stderr)
return 1
files = sorted(x for x in d.glob(a.glob) if x.is_file())
for i, f in enumerate(files, 1):
new = d / f"{a.prefix}_{i:03d}{f.suffix.lower()}"
print(f"{f.name} -> {new.name}") # 結果は標準出力へ
if not a.dry_run:
f.rename(new)
print(f"{len(files)} 件{'(dry-run)' if a.dry_run else ''}", file=sys.stderr) # 件数は標準エラーへ
return 0
if __name__ == "__main__":
sys.exit(main())
$ ./renamer.py --help
usage: renamer [-h] [-p PREFIX] [-g GLOB] [-n] [--version] folder
フォルダー内のファイルを連番の名前に変える
positional arguments:
folder 対象のフォルダー
options:
-h, --help show this help message and exit
-p, --prefix PREFIX 新しい名前の先頭 (既定: file)
-g, --glob GLOB 対象にするファイルのパターン (既定: *)
-n, --dry-run 変えずに、変えた後の名前だけ表示する
--version show program's version number and exit
$ ./renamer.py pics -n -p trip
IMG_0001.JPG -> trip_001.jpg
IMG_0002.JPG -> trip_002.jpg
IMG_0003.JPG -> trip_003.jpg
3 件(dry-run)
$ ./renamer.py
usage: renamer [-h] [-p PREFIX] [-g GLOB] [-n] [--version] folder
renamer: error: the following arguments are required: folder
$ echo $?
2
$ ./renamer.py pics --size 10
usage: renamer [-h] [-p PREFIX] [-g GLOB] [-n] [--version] folder
renamer: error: unrecognized arguments: --size 10
$ ./renamer.py nothere
renamer: 'nothere' はフォルダーではありません
$ echo $?
1
$ ./renamer.py demo -n | wc -l # 件数(標準エラー)は画面に残り、結果の4行だけが wc に渡る
4 件(dry-run)
4
1--help は自動で付く
add_argument の help の文がそのまま一覧になった。-h も自動で使える。
2使い方の誤りは終了コード2
引数の不足・知らないオプションで、usage とエラー文を出して2で終わった。
3出口を分けるとつなぎやすい
結果は標準出力、件数は標準エラー。パイプで wc に渡したのは結果の4行だけだった。
引数の種類(必須・選択・複数・サブコマンド)の一覧と雛形は、関連記事「Python argparse 使い方|引数一覧表とCLI雛形・3.14対応」で扱っています。
CLIのよくあるエラー(command not found・unknown option)
この節では、CLI を使い始めたときによく見るエラー文の原文と、原因・直し方が分かります。
CLI のエラー文は英語でも、決まった形が多く、文の中に原因の言葉がそのまま入っています。 手元で出た原文です(終了コードつき)。
| エラーの原文 | 原因 | 直し方 |
|---|---|---|
bash: line 1: gti: command not found(127) |
コマンド名の綴りの誤り、入っていない、PATH に無い | 綴りを確かめる。command -v 名前 で場所を探す。入れる |
ls: unrecognized option '--foo'(2) |
そのコマンドに無い長いオプション | ls --help で正しい名前を見る |
ls: invalid option -- 'y'(2) |
そのコマンドに無い1文字のオプション | 同上。Mac と Linux で使えるオプションが違うことがある |
error: unknown option `foo'(git・129) |
サブコマンドに無いオプション | git はこの後に使える一覧を出す。その中から選ぶ |
git: 'comit' is not a git command.(1) |
サブコマンドの綴りの誤り | 続けて The most similar command is commit と候補が出た |
unknown flag: --foo(docker・125) |
docker のサブコマンドに無いフラグ | docker ps --help を見る |
docker: unknown command: docker cotainer(1) |
サブコマンドの綴りの誤り | docker --help の一覧と比べる |
cat: nofile.txt: No such file or directory(1) |
ファイル名・場所の誤り | pwd と ls で今いる場所と名前を確かめる |
bash: line 1: ./s.sh: Permission denied(126) |
スクリプトに実行権限が無い | chmod +x s.sh か bash s.sh |
cp: missing destination file operand after 'a'(1) |
引数が足りない(コピー先が無い) | usage を見て、引数の数と順番を合わせる |
error: -n requires an argument(git・128) |
値の要るオプションに値が無い | git log -n 5 のように値を付ける |
mkdir: cannot create directory ‘a’: File exists(1) |
同じ名前がすでにある | 別の名前にする。あってもよければ mkdir -p |
command not found のときの確かめ方
$ command -v git python3
/usr/bin/git
/usr/local/bin/python3
$ command -v gti # 何も出ず、終了コードは1
綴りが正しいのに見つからないときは、入れたばかりで PATH(コマンドを探す場所の一覧)に入っていないことがよくあります。ターミナルを開き直すと反映されることがあります。Linux のコマンドを広く知りたいときは関連記事「Linuxコマンド一覧|100個をカテゴリ別に実行結果つきで解説」で扱っています。
空白を含むファイル名
$ ls 'my file.txt'
ls: cannot access 'my file.txt': No such file or directory
シェルは空白で単語を分けるため、空白を含む名前は 'my file.txt' のように引用符で囲みます。囲まないと my と file.txt の2つの引数として渡ります。スクリプトの "$f" のように変数を引用符で囲むのも、同じ理由です。
CLIで事故を防ぐ(dry-run・確認・取り消し)
この節では、確認なしで実行される CLI で、消す・上書きするといった失敗を防ぐ方法が分かります。
CLI の多くのコマンドは、確認の画面を出さずにすぐ実行します。 手元では、rm -rf を引数なしで打っても何も聞かれず、終了コード0で終わりました(何も消していないため)。引数が付いていれば、その場で消します。GUI のごみ箱のような「戻す場所」もありません。
- 1先に「見るだけ」で対象を確かめる消す・変える前に、同じ条件で ls や grep を流して対象の一覧を見る
- 2dry-run で流すecho を前に付ける、--dry-run・-n があれば付ける。手元の名前変更も先に echo で3行だけ見た
- 3上書きしないオプションを使うmv -n・cp -n は同じ名前があれば上書きしない。rm -i・mv -i は1つずつ聞く
- 4どの環境にいるかを確かめる本番のサーバーか手元か。hostname・pwd・プロンプトの表示を見てから打つ
- 5変える前に写しを取るフォルダーを丸ごとコピーするか、Git で管理している場所なら commit してから流す
Windows の PowerRename は、実行前のプレビューと、実行後に元に戻す機能(エクスプローラーの Ctrl+Z)を持っていると Microsoft Learn に書かれています。「実行前に確かめる」「戻せる」を GUI は道具が持ち、CLI は使う人が手順として持つ、という違いです。
消すコマンドを打つとき
rm -rf の行を、何が対象になるか確かめずに貼って実行するls を流して対象を見る。次に echo rm … で消す予定の一覧を出し、納得してから echo を外すCLI は「打った通りに動く」。打つ前の確かめが手順の一部
CLIとGUIの使い分け判断表と覚え方
この節では、作業ごとに CLI と GUI のどちらを選ぶかの目安と、CLI を覚える順番が分かります。
迷ったら「繰り返すか」「件数が多いか」「記録が要るか」の3つで決めます。 どれも当てはまらないなら GUI で十分に速く、無理に CLI にする理由はありません。
| 作業 | 向いている方 | 理由 |
|---|---|---|
| 写真を1枚選んで名前を変える | GUI | 見て選ぶほうが速い |
| 100枚に同じ規則で名前を付ける | どちらも可 | Finder・PowerRename にまとめて変える機能がある |
| 100個のファイルの中身から語を探す | CLI | grep 1行。GUI は1つずつ開く |
| 毎週、同じ集計をする | CLI | スクリプトを流すだけ。結果が毎回同じ |
| 画面の無いサーバーで作業する | CLI | SSH の文字だけで操作できる |
| デザインの調整・画像の編集 | GUI | 見た目を見ながら直す作業 |
| はじめて使うクラウドのサービス | GUI で全体を見てから CLI | 画面で項目を覚え、決まった操作は CLI で記録する |
| 手順書・CI に入れる作業 | CLI | コマンドの文字をそのまま貼れる |
CLI を覚える順番
- 1見るだけのコマンド:pwd・ls・cat・less何も変えないので、打ち間違えても困らない
- 2移動と作成:cd・mkdir・cp・mv練習用のフォルダーの中だけで試す
- 3--help の読み方と4つの部品知らないコマンドでも、usage から使い方を組み立てられるようになる
- 4探す・数える:grep・wc・sort・uniq とパイプGUI では手間な作業が1行になる体験をする
- 5仕事で使う CLI:git・docker・gh・クラウドの CLI同じ「コマンド+サブコマンド」の形で読める
- 6スクリプトと自作の CLI繰り返す作業をファイルにし、argparse などで道具にする
覚えるコツは、全部を暗記しないことです。 よく使う10個ほどを手で覚え、残りは --help と history(打ったコマンドの履歴)で探します。Tab キーを押すと、コマンド名やファイル名の続きをシェルが補ってくれるので、打ち間違いも減ります。GitHub を CLI で操作する例は、関連記事「GitHub CLI(gh)の使い方|逆引きコマンド一覧とjqレシピ」で扱っています。
よくある質問
Q. CLIとは何ですか? A. Command Line Interface の略で、文字でコマンドを打ってコンピューターを操作する方式です。プロンプトの後ろに1行ずつ命令を打ち、結果も文字で返ります。
Q. CLIとGUIの違いは何ですか? A. GUI は画面のアイコンやボタンを見て選ぶ方式、CLI は名前を知っているコマンドを打って指示する方式です。GUI は覚えやすく、CLI は同じ作業の繰り返し・大量の処理・記録と共有・自動化に強みがあります。
Q. CLIとCUIは同じですか? A. 日本ではほぼ同じ意味で使われています。CUI は「文字で操作する画面」全体、CLI は「コマンドを1行ずつ打つ方式」を指すことが多く、vim や top のように文字で画面全体を描くものは TUI と呼んで分けることがあります。
Q. CLIはGUIよりどのくらい速いですか? A. 作業によります。手元では、1万個のログの検索と CSV の集計が合わせて0.094秒でした。一方、1枚の写真の名前を変えるような作業は、GUI で見て選んだほうが速く済みます。差が大きく出るのは、件数が多いときと、同じ作業を繰り返すときです。
Q. 初心者はCLIとGUIのどちらから覚えるべきですか?
A. 普段の作業は GUI で進め、CLI は「見るだけのコマンド」から少しずつ覚えるのが安全です。プログラミングを学ぶなら、Git・npm・pip など CLI で使う道具が早い段階で出てくるため、pwd・ls・cd と --help の読み方を先に押さえると進みやすくなります。
Q. Windowsでは何を開けばCLIを使えますか? A. Windows ターミナルを開き、PowerShell かコマンドプロンプトを使います。Linux のコマンドを使いたいときは WSL の bash も選べます(Microsoft Learn)。
Q. 「command not found」と出ました。
A. コマンド名の綴りの誤り、そのコマンドが入っていない、入っているが PATH に無い、のどれかです。command -v 名前 で場所が出るかを確かめ、入れたばかりならターミナルを開き直します。手元では終了コードは127でした。
Q. 「unknown option」「unrecognized option」と出ました。
A. そのコマンドに無いオプションを付けています。コマンド --help(AWS CLI は aws help)で正しい名前を確かめます。Mac と Linux では、同じ名前のコマンドでも使えるオプションが違うことがあります。
Q. コマンドの途中で止めたいときは?
A. Ctrl+C を押すと、実行中のコマンドを止められます。less や man のような画面は q で、vim は Esc の後に :q で終わります。ターミナル自体を閉じるときは exit と打ちます。
Q. CLIで消したファイルは戻せますか?
A. rm で消したファイルは、ごみ箱を通らずに消えます。消す前に ls で対象を見る、echo で dry-run をする、rm -i で1つずつ確かめる、大事なフォルダーは写しを取るか Git で管理してから作業する、の順で防ぎます。
Q. CLIツールは自分で作れますか?
A. 作れます。Python なら標準の argparse で、--help・使い方の誤りのエラー表示・終了コード2が自動で揃った CLI を30行ほどで作れました。結果は標準出力、エラーや件数は標準エラーに出すと、ほかのコマンドとつなぎやすくなります。
まとめ
- CLI は文字でコマンドを打って操作する方式。GUI は見て選ぶ方式で、CLI は記録・再実行・自動化に強い。
- 手元の実測では、1万個のログの検索と CSV の集計が0.094秒。名前変更は1ファイルごとに mv を起動すると1万件で18.4秒、Python なら0.2秒で、CLI でも道具の選び方で速さが変わった。
- 同じスクリプトを2つの見本に流した結果のハッシュ値は、100・1,000・10,000件のすべてで一致した。CLI は打った文字がそのまま手順書になる。
- コマンドは「コマンド・サブコマンド・オプション・引数」の4つに分けて読む。git・docker・gh・aws とも同じ形で、
--help(aws はhelp)で書式が出る。 - 結果は標準出力、エラーは標準エラー、成否は終了コード(0が成功、127は command not found、2は使い方の誤りが多い)。打つ前に dry-run で対象を確かめる。
参考・出典
確認日はいずれも 2026年10月29日です。
- The Open Group「Utility Conventions」(The Open Group Base Specifications Issue 8 / IEEE Std 1003.1-2024):https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/V1_chap12.html
- GNU C Library「Program Argument Syntax Conventions」:https://www.gnu.org/software/libc/manual/html_node/Argument-Syntax.html
- AWS「Command structure in the AWS CLI」:https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-commandstructure.html
- AWS「Accessing help and resources for the AWS CLI」:https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-help.html
- AWS「CLI とは何ですか?」:https://aws.amazon.com/jp/what-is/cli/
- Microsoft Learn「Windows ターミナルの概要」:https://learn.microsoft.com/ja-jp/windows/terminal/
- Microsoft Learn「PowerRename – Windows のためのユーティリティ」:https://learn.microsoft.com/ja-jp/windows/powertoys/powerrename
- Apple サポート「Macで「ターミナル」を開く/終了する」:https://support.apple.com/ja-jp/guide/terminal/apd5265185d-f365-44cb-8b09-71a064a42125/mac
- Apple サポート「Rename files, folders and disks on Mac」:https://support.apple.com/en-gb/guide/mac-help/mchlp1144/27/mac/27
- Python ドキュメント「argparse — コマンドラインオプション、引数、サブコマンドのパーサー」:https://docs.python.org/ja/3/library/argparse.html
- Ecma International「ECMA-335 Common Language Infrastructure (CLI)」:https://ecma-international.org/publications-and-standards/standards/ecma-335/
- 手元の実行結果:git 2.43.0・Docker CLI 29.9.2・GitHub CLI 2.89.0 の
--help、GNU bash 5.2.21・coreutils 9.4・grep 3.11 のエラー文と終了コード
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「CLIとは?GUIとの違いを1万ファイルで実測|読み方と作り方」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。