結論

CLI(コマンドラインインターフェース)は、文字でコマンドを打ってコンピューターを操作する方式です。マウスで画面を操作する GUI と比べて、同じ作業を何度でも同じ結果で繰り返せること、ほかの道具とつないで自動化できることが強みです。

この記事でわかること

  • 100〜1万ファイルの名前変更・検索・集計をCLIで実測した時間と手数
  • git・docker・gh の --help の実物で読む、コマンドの4つの部品
  • 終了コード・エラー原文と、argparse で作る最小のCLI

2026年10月29日更新|Ubuntu 24.04・bash 5.2・Python 3.13 で実行確認

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メニューの写真を見て指さして頼む。初めての店でも迷わないが、30人分を同じ注文にするのは手間
↔
CLI注文票に品名と数を書いて渡す。品名を知っている必要はあるが、票をコピーすれば何度でも同じ注文になる

見分ける問い:「この作業を、もう一度・別の人が・同じようにするか」

同じ作業をGUIとCLIで比べる(100〜1万ファイルの実測)

この節では、ファイルの名前変更・検索・集計という同じ作業を CLI で実行した時間と手数、GUI での手順の数、そして「再現できるか」の違いが分かります。

手元で、写真100枚(IMG_0001.JPG〜)・ログ100個・売上 CSV 100個の見本を作り、次の3つを行いました。

  1. 名前変更:IMG_0001.JPG を trip_001.jpg の形にする(連番を3桁、拡張子を小文字)。
  2. 検索:100個のログのうち、ERROR を含むファイルを探す。
  3. 集計: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
0.199秒100ファイルの名前変更bash の for と mv
0.002秒100個のログの検索grep -l・14個が該当
0.003秒CSV 100個の店舗別集計tail・awk・sort をパイプでつなぐ

件数を増やしたときの時間(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 を使うには、まずターミナルのアプリを開きます。 手順は各社の公式ドキュメントで確かめた範囲です。

1

Windows:Windows ターミナルを開く

Microsoft Learn は、Windows ターミナルを「コマンド プロンプト、PowerShell、bash (Windows Subsystem for Linux (WSL) 経由) など」のシェルのためのホスト アプリケーションと説明しています。タブごとに PowerShell やコマンドプロンプトを選べます。

Microsoft Learn「Windows ターミナルの概要」

2

Mac:「ターミナル」を開く

Apple のターミナル ユーザガイドでは、Launchpad で「ターミナル」と入力して開く方法と、Finder で「/アプリケーション/ユーティリティ」フォルダの「ターミナル」をダブルクリックする方法が案内されています。既定のシェルは zsh です。

Apple サポート「Macで「ターミナル」を開く/終了する」

3

Linux:端末(ターミナル)のアプリを開く

デスクトップのある Linux では「端末」などのアプリを開きます。画面の無いサーバーでは、SSH でつないだ時点で CLI になっています。

この記事の実行環境は Linux の bash

4

最初の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
  1. 1awk '{print $2}' logs/*.log100個のログの各行から、2番目の欄(INFO・WARN・ERROR)だけを出す
  2. 2sort同じ文字が並ぶように並べ替える
  3. 3uniq -c続いて並んだ同じ行を1つにまとめ、数を付ける
  4. 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. 1見るだけのコマンド:pwd・ls・cat・less何も変えないので、打ち間違えても困らない
  2. 2移動と作成:cd・mkdir・cp・mv練習用のフォルダーの中だけで試す
  3. 3--help の読み方と4つの部品知らないコマンドでも、usage から使い方を組み立てられるようになる
  4. 4探す・数える:grep・wc・sort・uniq とパイプGUI では手間な作業が1行になる体験をする
  5. 5仕事で使う CLI:git・docker・gh・クラウドの CLI同じ「コマンド+サブコマンド」の形で読める
  6. 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期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ
参加受付中

AI駆動開発、 無料セミナー