ターミナルの基本:隔離した練習場所でデータの流れをつかむ

よるほろぐ編集部

· 更新: 2026年7月10日 · 約 12 分

ターミナルは、コマンドを暗記する場所ではありません。シェルに「どのデータを入力にし、どこへ出力し、成功したかをどう確かめるか」を伝える場所です。この見方が身につくと、初めて見るコマンドにも man--help を使って安全に向き合えます。

ここでは Bash と GNU coreutils が使える Linux 環境を前提に、個人のファイルや設定には触れません。mktemp -d が作る一時ディレクトリの中だけで、作成、コピー、移動、削除、入出力の流れを試します。コマンドは、表示された結果を確かめてから次へ進んでください。

まず練習場所を分ける

ターミナルで作業するとき、すべてのパスは「現在地」を基準に解釈されます。現在地を確認する pwd の出力は絶対パスです。一方、archive/today.txt のように現在地から書くパスは相対パスです。練習では現在地を意図的に分けておくと、短い相対パスでも対象を見失いません。

次を入力します。最初の二行は、一時ディレクトリを作れなかった場合に処理を止めるためのものです。mktemp -d が失敗したときは、その場で終わるので、以降の操作を続けないでください。

workdir=$(mktemp -d) || exit 1
cd "$workdir" || exit 1
pwd

出力は /tmp/ 以下の、毎回異なる名前のディレクトリです。ここで表示された場所が今回の作業範囲です。変数 workdir は最後の片付けでも使うため、途中で別の値を代入しないでください。"$workdir" のように引用符で囲む書き方は、パスに空白などが含まれても一つの引数として渡すための習慣です。

練習の境界: 以降のコードは、この pwd の出力が一時ディレクトリであることを確認してから実行します。普段の作業場所や他人のディレクトリで試さないでください。

パスをたどって作成・コピー・移動する

まず、相対パスでディレクトリとファイルを作ります。printf は指定した文字列を標準出力へ出すコマンドです。ここでは > がその出力を incoming/note.txt へ渡し、ファイルを作ります。

mkdir incoming archive
printf '%s\n' 'reading: terminal practice' > incoming/note.txt
ls -l incoming

ls -l incoming の一覧に note.txt があれば、作成は成功です。次に cp は元のファイルを残して複製し、mv は指定したパスへ移動します。同じディレクトリ内で名前を変えるときも mv を使います。

cp incoming/note.txt archive/note-copy.txt
mv archive/note-copy.txt archive/today.txt
test -f archive/today.txt && printf '%s\n' '移動を確認しました'

最後の test -f は、通常ファイルがその場所にあるかを確認します。条件を満たすと && の右側が実行されるので、移動を確認しました と表示されれば確認まで完了です。画面に表示するだけでなく、対象のパスを条件として確かめることが大切です。

削除も、存在を確認できる小さな対象でだけ試します。ここでは複製した一時ファイル一つだけを削除し、test ! -e で消えたことを確かめます。再帰的にディレクトリ全体を消すオプションは、この練習では使いません。

cp archive/today.txt archive/disposable.txt
rm -- archive/disposable.txt
test ! -e archive/disposable.txt && printf '%s\n' '削除を確認しました'

-- は、その後ろをオプションではなくファイル名として扱わせる区切りです。削除の前後を test で確認する流れを持つと、対象を意識しないまま操作する癖を避けられます。

標準入力・標準出力・標準エラーを分けて見る

プログラムには、既定で三つのデータの通り道があります。キーボードやファイルから受け取る 標準入力 、通常の結果を出す 標準出力 、診断や失敗の説明を出す 標準エラー です。ターミナルは通常、標準出力と標準エラーの両方を画面に見せます。そのため、表示だけでは二つを区別しにくいことがあります。

次の波かっこは、二つの printf を一まとまりにします。二つ目の >&2 は、その行を標準エラーへ送る指定です。まとまりの後ろにある > standard-output.txt2> standard-error.txt によって、二つの通り道を別々のファイルへリダイレクトします。

{
  printf '%s\n' '標準出力へ送る行'
  printf '%s\n' '標準エラーへ送る行' >&2
} > standard-output.txt 2> standard-error.txt

cat standard-output.txt
# 標準出力へ送る行

cat standard-error.txt
# 標準エラーへ送る行

cat はファイルの内容を自分の標準出力へ出しています。つまり、同じ文字列でも「どの通り道に出したか」と「後でどの通り道に流し直したか」は別の操作です。エラーをファイルに分けておけば、通常の結果だけを後続処理へ渡したり、問題の説明だけを見直したりできます。

> は出力先を新しく書き込み、>> は末尾へ追加します。< はファイルを標準入力へつなぎます。次は二行のデータを作り、grep の標準出力を wc -l の標準入力へパイプし、件数をファイルに保存します。

printf '%s\n' 'first task' > tasks.txt
printf '%s\n' 'second task' >> tasks.txt

grep 'task' < tasks.txt | wc -l > task-count.txt
cat task-count.txt
# 2

この一行では、tasks.txtgrep の入力になり、grep が選んだ行がパイプ | を通って wc -l に渡り、その結果だけが task-count.txt に保存されます。パイプは「前のコマンドの画面出力を次のコマンドの画面入力へつなぐ」ものではなく、標準出力と標準入力を直接つなぐ仕組みです。もし grep が標準エラーへ説明を出しても、2> を指定しない限り、その説明はこのパイプには入りません。

引用符と glob はシェルが解釈する

シェルは、コマンドを起動する前に引用符や * を解釈します。空白を含むパスは二つの引数に分かれないよう二重引用符で囲みます。次の例では、コピーの成功もファイルの存在で確認します。

mkdir "space dir"
cp tasks.txt "space dir/tasks list.txt"
test -f "space dir/tasks list.txt" && printf '%s\n' '空白を含むパスのコピーを確認しました'

一方、引用符で囲まれていない * は glob としてファイル名の一覧に展開されます。今のディレクトリには複数の .txt ファイルがあるため、最初の printf はそれらのパスを一行ずつ出します。単一引用符で囲んだ二つ目では、* はただの文字です。

printf '%s\n' ./*.txt
printf '%s\n' '*.txt'
# *.txt

ファイル名や変数を渡すときに引用符を外すと、空白による分割や glob 展開が意図せず起きます。逆に、パターンとして探したいときだけ引用符を外す、と役割で決めると判断しやすくなります。変数、引用符、条件分岐を使ってコマンドを組み立てる場面は、次の シェルスクリプトの基本 で扱います。

終了ステータスとヘルプで判断する

コマンドは画面への表示だけでなく、終了ステータスでも結果を返します。Bash では直前のコマンドの状態を $? で読めます。次の grep -q は一致した行を表示せず、見つかったかだけを終了ステータスにします。$? は次のコマンドで上書きされるため、すぐに変数へ保存します。

grep -q 'second task' tasks.txt
status=$?
printf '一致した場合の終了ステータス: %s\n' "$status"
# 一致した場合の終了ステータス: 0

grep -q 'not-present' tasks.txt
status=$?
printf '一致しなかった場合の終了ステータス: %s\n' "$status"
# 一致しなかった場合の終了ステータス: 1

Bash では一般に 0 が成功、0 以外が成功以外を表します。ただし意味はコマンドごとに確認します。GNU grep では、この例の 1 は「一致する行がなかった」という検索結果であり、読み取り失敗などのエラーとは区別されます。画面が空でも、終了ステータスを読むことで「何もなかった」のか「処理自体に問題があった」のかを切り分ける入口になります。

オプションの意味や削除対象の扱いに迷ったら、推測で実行しません。ローカルに入っている説明は man、GNU 系のコマンドで短い使い方を確認するには --help を使います。次の二つはどちらも説明を表示するだけです。less を閉じるには q を押します。

man cp
grep --help | less

man はインストールされている版の説明を読む手段です。--help の対応や表示内容はコマンドによって異なるため、実際に使う前に対象の環境で確認してください。

片付けまでを操作に含める

練習を終えたら、作ったファイルを名前で列挙してから、空になったディレクトリだけを rmdir で消します。ここでは workdirmktemp -d が作った値が残っていることを前提にしています。先に cd / で一時ディレクトリの外へ移動し、各ファイルを明示的に指定します。rmdir は空でないディレクトリを削除しないため、消し忘れがあれば止まります。

cd /
rm -- "$workdir"/incoming/note.txt \
  "$workdir"/archive/today.txt \
  "$workdir"/standard-output.txt \
  "$workdir"/standard-error.txt \
  "$workdir"/tasks.txt \
  "$workdir"/task-count.txt \
  "$workdir"/"space dir"/"tasks list.txt"
rmdir "$workdir"/incoming "$workdir"/archive "$workdir"/"space dir" "$workdir"
test ! -e "$workdir" && printf '%s\n' '練習場所を片付けました'

最後の表示が出れば、今回の練習で作った場所は残っていません。普段の作業でも、操作前に現在地と対象パスを確認し、操作後はファイルの存在、出力内容、終了ステータスのいずれかで成功を確かめる流れを繰り返してください。

この次は、検索結果を加工する テキスト処理:grep・sed・awk 入門 と、より高速な検索の選択肢を紹介する ripgrep / fd / fzf のターミナル検索ツール入門 を読むと、パイプに渡すデータを増やせます。ファイルを誰が読み書きできるかを理解するには、権限とパーミッション:chmod・chown を理解する へ進んでください。

出典

共有: X でシェア はてブ

編集・検証

よるほろぐ編集部

Linux・コンテナ・CLI・開発環境の実践ガイドを編集・検証します。

編集方針を読む