Linux入門⑥|Bashとコマンドの仕組み(パイプ・リダイレクト・PATH)

Linux入門⑥|Bashとコマンドの仕組み(パイプ・リダイレクト・PATH) Linux

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

Linux入門⑥|Bashとコマンドの仕組み(パイプ・リダイレクト・PATH)

その感覚は、正しいです。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 で、動いているものの確認と、ログの見方を整理します。

→ 第7回:プロセスとサービス

参考

ITもごはんも、腹八分目が長続きのコツ!

コメント