Bash は、文字をつないで使う道具です。「コマンドの意味は、なんとなく分かったんですが、| とか > とか、記号が、よく分かりません」

その感覚は、正しいです。Linux のコマンドは、1つ1つは、小さな道具です。それを、記号でつなぐことで、大きな仕事ができるようになります。ここが、Linux が、運用の現場で、愛される理由でもあります。
シリーズ「Windows ユーザーのための、やさしい Linux 入門」の第6回です。前回(第5回:Permission denied の読み方)で、権限が分かりました。今回は、Bash とコマンドの仕組みです。後半は、PowerShell との違いを、整理します。
結論:Bash は「文字を、つないで使う」道具。PowerShell は「オブジェクトを、つなぐ」道具
| 比べる点 | Bash(Linux) | PowerShell(Windows) |
|---|---|---|
| パイプで流れるもの | 文字(テキスト) | オブジェクト(プロパティを持つもの) |
| 絞り込み | grep、awk など(文字で検索) |
Where-Object(プロパティで検索) |
| 名前の付け方 | 短い(ls、cp) |
動詞-名詞(Get-ChildItem) |
| 変数 | $name |
$name |
| 大文字・小文字 | 区別する | 区別しない |
| スクリプトの拡張子 | .sh |
.ps1 |
パイプで渡るのが「文字」であることが、Bash の、最大の特徴です。
コマンドの構造:「コマンド オプション 引数」
ls -l /var/log
| 部分 | 呼び方 | 意味 |
|---|---|---|
ls |
コマンド | 何をするか |
-l |
オプション | 動かし方の指定 |
/var/log |
引数 | 何に対してするか |
間は、スペースで区切ります。スペースが、ファイル名の中に含まれている場合は、次の「引用符」が、必要になります。
Bash の引用符:スペースと特殊文字を、守る
| 書き方 | 動き |
|---|---|
"..."(ダブル) |
変数が展開される($HOME が、実際の値になる) |
'...'(シングル) |
中身を、そのまま文字として扱う(展開しない) |
\ |
次の1文字を、特別扱いしない |
echo "Home is $HOME"
echo 'Home is $HOME'
実行結果(例):
Home is /home/taro
Home is $HOME
ダブルは展開する、シングルは展開しない。PowerShell と、同じ考え方です。
ファイル名に、スペースがある場合は、引用符で囲みます。
cat "my memo.txt"
囲まないと、my と memo.txt の、2つのファイルとして扱われ、エラーになります。
環境変数と PATH
| 比べる点 | Windows | Linux |
|---|---|---|
| 変数の参照 | %PATH%、$env:PATH |
$PATH |
| 区切り文字 | ; |
: |
| 確認コマンド | Get-ChildItem Env: |
printenv、env |
echo $PATH
echo $HOME
実行結果(例):
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
/home/taro
PATH は、「コマンドを探す場所の、リスト」です。:(コロン)で区切られ、左から順に探します。
「command not found」と出たときは、そのコマンドが、PATH に含まれる場所にないことが、よくあります。
which ls
type ls
実行結果(例):
/usr/bin/ls
ls is /usr/bin/ls
which と type は、そのコマンドの実体が、どこにあるかを教えてくれます。
Bash で助けを呼ぶ:man、--help、history
| コマンド | 内容 |
|---|---|
man ls |
マニュアルを表示(q で終了、/ で検索) |
ls --help |
使い方の要約を表示 |
history |
これまで打ったコマンドの履歴 |
echo |
文字や変数を、表示 |
迷ったら、man コマンド名。この「公式の説明書」が、手元で読めることが、Linux のよいところです。Windows の Get-Help に、近い存在です。
Ctrl + R を押すと、履歴から、検索できます。長いコマンドを、もう一度打ちたいときに、重宝します。
パイプ(|):コマンドを、つなぐ
パイプは、左のコマンドの出力を、右のコマンドの入力に渡します。
ls -l /etc | grep conf
ls -l /etc | wc -l
実行結果(例):
$ ls -l /etc | grep conf
-rw-r--r-- 1 root root 2969 Aug 1 2022 debconf.conf
-rw-r--r-- 1 root root 685 Feb 14 2022 e2scrub.conf
-rw-r--r-- 1 root root 552 Mar 30 2022 pam.conf
$ ls -l /etc | wc -l
118
| コマンド | 役割 |
|---|---|
grep 文字列 |
その文字列を含む行だけを残す |
wc -l |
行数を数える |
sort |
並べ替え |
head -n 5 |
先頭の5行 |
tail -n 5 |
末尾の5行 |
grep は、文字列を、検索して、その行を表示します。オプションとして、-i(大文字・小文字を無視)、-n(行番号を表示)、-v(含まない行を選ぶ)、-r(ディレクトリの中を、再帰的に検索)が、よく使われます。
リダイレクト:出力を、ファイルへ
| 記号 | 意味 | 例 |
|---|---|---|
> |
出力を、ファイルに書く(上書き) | ls > list.txt |
>> |
出力を、ファイルの末尾に追加 | echo "追記" >> list.txt |
< |
ファイルを、入力として渡す | wc -l < list.txt |
2> |
エラー出力だけを、ファイルに | ls /nothing 2> error.txt |
2>&1 |
エラー出力を、通常の出力と一緒にする | command > all.txt 2>&1 |
⚠ 注意:
>は、上書きです>を使うと、ファイルの中身が、消えて、置き換わります。既存のファイル名に、うっかり、>を使うと、元のデータが失われます。追加したいときは、>>。
PowerShell との、考え方の違い:「文字」vs「オブジェクト」
同じ「ファイルの一覧から、サイズの大きいものを探す」でも、考え方が違います。
Get-ChildItem | Where-Object Length -gt 1MB
ls -l | awk '$5 > 1000000'
| PowerShell | Bash | |
|---|---|---|
| 書き方 | 上の1つ目(PowerShell) | 上の2つ目(Bash) |
| 渡るもの | オブジェクト(Length という名前付きの値) | 文字(5列目という位置) |
| 強み | 名前で指定できるので、読みやすい | 短く書ける。どの OS にも、ある |
| 弱み | 長くなりやすい | 列の位置が変わると、壊れる |
どちらが優れている、ではありません。Linux のサーバーでは、Bash が標準なので、読めることが、重要です。Windows では、PowerShell を使う。両方を、状況に応じて使い分けるのが、現場の実際の姿です。
Windows ↔ Linux:対応表
| やりたいこと | PowerShell | Bash |
|---|---|---|
| 文字を出す | Write-Output(echo) |
echo |
| 変数の表示 | $env:PATH |
$PATH |
| 環境変数の一覧 | Get-ChildItem Env: |
printenv |
| 文字列の検索 | Select-String |
grep |
| ヘルプ | Get-Help |
man、--help |
| 履歴 | Get-History |
history |
| コマンドの場所 | Get-Command |
which、type |
| 行数を数える | Measure-Object -Line |
wc -l |
| ファイルへ出力 | > file、Out-File |
> file |
僕のやらかし:> で、設定ファイルを、消した
設定ファイルに、1行を足したくて、こう打ちました。
echo "新しい設定" > settings.conf
追加のつもりが、>(上書き)でした。元の設定が、すべて消えました。バックアップは、取っていません。
調味料の瓶に、新しい調味料を足すつもりで、瓶の中身を、全部、捨ててしまったようなものです。今は、設定ファイルをいじる前に、cp settings.conf settings.conf.bak をしています。追加は、>>です。
今回覚えたこと
| 項目 | 意味 |
|---|---|
| コマンド・オプション・引数 | 動かす、動かし方、対象 |
"..." と '...' |
展開する/展開しない |
$PATH |
コマンドを探す場所(: 区切り) |
man、--help |
説明書を読む |
| パイプ(縦棒の記号) | 出力を、次のコマンドの入力に |
>、>> |
上書き、追記 |
grep |
文字列で絞り込み |
次回予告
次回は、プロセスとサービスです。ps、top、kill、そして、systemctl と journalctl で、動いているものの確認と、ログの見方を整理します。
参考
ITもごはんも、腹八分目が長続きのコツ!

コメント