Linuxでコマンドを実行する基本は、端末で「コマンド名、オプション、引数」を入力してEnterを押すことです。しかし、安全に使うには、シェルが文字列をどう分割・展開し、どの実体を探し、入出力をどこへつなぎ、成功をどう返すかを理解する必要があります。本稿はBashを想定し、現在地やファイル一覧を確認する読み取り専用の例から始めます。インターネットで見つけた長い一行をそのまま貼らず、対象、権限、変更内容、復旧方法を分解して確認する習慣を身に付けてください。
端末とシェルとコマンドの役割
端末は文字を入出力する画面、シェルは入力を解釈するコマンド言語、コマンドは実際の処理を行う組み込み機能またはプログラムです。Bashは入力を読み、引用符を考慮して単語や演算子へ分け、aliasや各種展開を行い、リダイレクトを準備し、関数・組み込み・PATH上の実行ファイルを探して起動します。特殊文字を含む引数が予期せず分割されたり、ワイルドカードへ展開されたりするのは、この処理を経るためです。
最初の読み取り専用コマンド
まずpwdで現在の作業ディレクトリ、lsでその場所の項目、idで現在の利用者とグループ、unameでシステム情報を確認します。表示コマンドでも、ディレクトリが巨大なら一覧作成に時間がかかり、アクセス履歴が残る場合があります。ルート全体を無差別に探索せず、運用手順で指定された範囲を確認します。
pwd
ls --
id
uname -sr
--は多くのGNUコマンドでオプションの終わりを示します。後ろに-で始まるファイル名が来ても、オプションと誤認されにくくなります。ただし、すべてのコマンドが対応するとは限らないため公式ヘルプで確認します。例の出力を記事と完全一致させる必要はありません。OS、ロケール、権限、ディレクトリ内容により異なります。
コマンド名、オプション、引数
ls -l /var/logでは、lsがコマンド名、-lが長い形式を選ぶオプション、/var/logが対象引数です。短いオプションはまとめられる場合がありますが、意味は各コマンドの仕様です。大文字と小文字も区別されます。推測でオプションを付けず、--help、man、公式マニュアルを確認します。ヘルプの角括弧は省略可能項目を表す記法であり、通常は括弧自体を入力しません。
ls --help
man ls
本番サーバーでヘルプを見ること自体は通常読み取りですが、manがページャーを起動するため非対話ジョブでは待機することがあります。自動処理へヘルプ呼び出しを混ぜません。また、Web上のマニュアルが対象ホストの版と異なることがあるため、インストール済みコマンドの--versionとディストリビューションの文書を照合します。
どの実体が実行されるか確認する
同じ名前でもalias、関数、Bash組み込み、外部プログラムの可能性があります。typeやcommand -Vで解決結果を確認できます。たとえばcdは現在のシェルの作業ディレクトリを変える必要があるため組み込みです。対話環境のaliasはスクリプトで展開されないことが多く、端末では動くのにジョブでは違う挙動になる原因になります。
type ls
type cd
command -V printf
セキュリティ上、PATHの先頭に書き込み可能なディレクトリがあると、同名の偽プログラムを実行する危険があります。管理ジョブではPATHを明示し、重要なコマンドは信頼できる絶対パスを使います。ただし、絶対パスはディストリビューション間で異なるため、配布スクリプトでは起動時に存在と所有者を検証するなど設計が必要です。whichだけではaliasや関数を十分に説明できないため、Bashではtypeを優先します。
空白を含む引数は引用する
シェルは引用されていない空白で単語を分けます。ファイル名に空白がある場合は、パス全体をダブルクォートまたはシングルクォートで囲みます。変数展開を使う場合は原則として"$variable"と引用し、空白やワイルドカードを含んでも一つの引数として渡します。変数を引用しないと、単語分割とファイル名展開で対象が増える可能性があります。
ls -l -- 'Quarterly Report.txt'
file_path='./Quarterly Report.txt'
stat -- "$file_path"
シングルクォートとダブルクォート
- シングルクォートは中の文字をほぼそのまま扱い、変数やコマンド置換を展開しない。
- ダブルクォートは空白による分割を防ぎながら、$variableや$(command)など一部の展開を行う。
- 引用符自体は通常、引数の一部としてコマンドへ渡らない。
- コピーしたスマートクォートはシェルの引用符ではないため、ASCIIの引用符を使う。
- 秘密値をコマンド行へ直接書くと履歴やプロセス一覧へ露出する可能性がある。
ワイルドカード展開を理解する
*、?、角括弧のパターンは、シェルがコマンド実行前にファイル名へ展開します。ls *.logはlsがパターンを検索するのではなく、Bashが一致した複数の名前を引数として渡します。一致がないとパターン文字列がそのまま残るか、シェルオプションにより消える・エラーになるなど挙動が変わります。変更コマンドと広いワイルドカードを組み合わせず、まずprintfなどで展開対象を確認します。
printf '<%s>\n' ./*.log
先頭がドットの隠しファイルは通常の*に一致しないなど、見落としもあります。ファイル名に改行が含まれる可能性がある環境では、行区切り出力を後段で解析する方法は安全ではありません。大量ファイルでは展開後の引数がOS上限を超えることもあるため、findの安全な実行機能やNUL区切り対応を検討します。ただし、対象を変える処理は検証環境とバックアップを用意してからです。
終了状態で成功を確認する
コマンド終了後、Bashの$?には直前コマンドの終了状態が入ります。慣例的に0は成功、0以外は失敗ですが、値の意味はコマンドごとに確認します。$?は次のコマンドを実行すると上書きされるため、すぐ変数へ保存します。画面にエラーがない、ファイルが作られたように見えるという理由だけで成功と判断しません。
stat -- /etc/hostname
status=$?
printf 'status=%s\n' "$status"
スクリプトではif command; then ... else ... fiのようにコマンド自体を条件へ置くと、終了状態を自然に扱えます。文字列出力を成功判定へ使うより堅牢です。失敗を無条件に|| trueで消すと原因を見落とすため、想定内の終了状態だけを明示的に処理します。
パイプとリダイレクト
縦棒|は左コマンドの標準出力を右コマンドの標準入力へつなぎます。標準エラーは通常パイプへ入りません。>は標準出力をファイルへ保存し、既存ファイルを切り詰めます。複雑な一行にする前に各段を単独で確認し、入力と出力を図にしておくと誤りを減らせます。パイプラインの既定の終了状態は末尾コマンドの結果なので、BashのpipefailやPIPESTATUSで途中の失敗も扱います。
printf '%s\n' alpha beta gamma | wc -l
管理者権限は必要な一操作に限定する
権限エラーが出たとき、すぐに管理者権限で端末全体を開き直すのではなく、対象、必要な権限、担当範囲を確認します。表示だけで済む別の監視APIや、管理者に出力を依頼する方法もあります。承認されたsudoを使う場合でも、実行する一コマンドを読み、シェルリダイレクトの権限主体、環境変数、作業ディレクトリを確認します。パスワードをコマンド引数やスクリプトへ埋め込みません。
スクリプトを実行する3つの方法
Bashスクリプトはbash script.shでBashへ渡す、実行権限とshebangを設定して./script.shとして実行する、現在のシェルへsource script.shで読み込む方法があります。sourceは変数や作業ディレクトリ、シェルオプションを現在のシェルへ残すため、独立実行とは影響範囲が違います。知らないスクリプトをsourceしません。まず読み取り、静的検査、検証環境、最小権限で確認します。
bash -n ./script.sh
bash ./script.sh
bash -nは構文を読み、通常はコマンドを実行せず構文エラーを検出しますが、論理や安全性を保証しません。構文が正しくても誤った対象を変更できます。シェルチェッカー、コードレビュー、テストデータ、バックアップ、ロールバックを組み合わせます。
コマンドを貼り付ける前のチェック
- 改行、セミコロン、&&、||、パイプ、リダイレクトを区切り、一段ずつ意味を説明する。
- URL短縮、コマンド置換、base64など、実行内容を隠す部分を展開せずに調査する。
- 対象パス、ホスト、利用者、環境が本番か検証かを一意なIDで確認する。
- 読み取りか変更か、既存データの上書き、サービス停止、ネットワーク影響を確認する。
- 必要権限を最小化し、バックアップ、復旧手順、メンテナンス時間、承認を用意する。
- 少量のテスト入力とdry-runが公式に提供される場合は利用し、結果と終了状態を確認する。
よくある「動かない」の切り分け
- command not found:スペル、PATH、インストール有無、alias・関数、実行ユーザーを確認する。
- Permission denied:ファイルの読み書き権限、ディレクトリの検索権限、実行ビット、マウント設定を確認する。
- No such file:現在地、相対パス、大文字小文字、引用、シンボリックリンクを確認する。
- 端末では動くがジョブで失敗:PATH、環境変数、作業ディレクトリ、対話入力、起動シェルを確認する。
- 出力が空:標準エラー、終了状態、フィルター条件、権限、入力データの形式を確認する。
- 処理が終わらない:入力待ち、ページャー、ネットワーク、ロック、巨大データを確認し、勝手に再実行しない。
Linuxコマンドは短くても、シェル展開、対象、権限、入出力、終了状態によって結果が変わります。最初はpwd、ls、id、type、helpなど変更しない確認から始め、引用と終了状態を身に付けてください。変更を伴う作業では、コマンドを知っていることより、影響範囲と戻し方を説明できることが重要です。

コメント