クォート(引用符)の使い分け

シェルは、コマンドラインに入力した文字列に対して、変数展開・コマンド置換・ワイルドカード展開などのさまざまな処理(展開)を行ってから実際のコマンドを実行します。クォート(引用符)は、この展開の一部または全部を抑制するために使います。

種類記法展開の扱い
シングルクォート'...'内部の文字列をすべてそのまま(リテラル)として扱う。変数展開・コマンド置換も行われない
ダブルクォート"..."変数展開($変数名)とコマンド置換(`...` や$(...))は行われるが、ワイルドカード展開(*等)や単語分割は抑制される
バックスラッシュ\文字クォートされていないバックスラッシュは、直後の1文字(改行を除く)をリテラルとして扱う(エスケープ)
name="World"
echo 'Hello, $name'    # → Hello, $name  (シングルクォート内は展開されない)
echo "Hello, $name"    # → Hello, World  (ダブルクォート内は変数展開される)
echo Hello,\ $name     # → Hello, World  (バックスラッシュでスペースをエスケープ)

特殊な意味を持つ文字(スペース、$、*、;など)をそのままの文字として扱いたい場合や、ファイル名にスペースが含まれる場合などにクォートが必要になります。

コマンドの種類を調べる:typeとwhich

同じコマンド名でも、シェルの組み込みコマンド(ビルトイン)・エイリアス・外部コマンド(実行ファイル)のいずれであるかによって挙動が変わることがあります。

type:シェルから見たコマンドの正体を調べる

typeは、指定した名前がシェルにとって何であるか(ビルトイン、エイリアス、外部コマンドとそのパスなど)を表示するシェルの組み込みコマンドです。

type cd
# cd is a shell builtin

type ls
# ls is /bin/ls

type ll
# ll is aliased to 'ls -l'

which:外部コマンドの実行ファイルの場所を調べる

whichは、PATH環境変数に設定されたディレクトリを順に検索し、実際に実行される外部コマンドの実行ファイルのフルパスを表示します。ビルトインコマンドやエイリアスはPATH上のファイルではないため、whichでは正しく判定できないことがあります(typeの方が確実です)。

which python3
# /usr/bin/python3

マニュアルページを調べる:man

manは、コマンドや設定ファイルの公式なマニュアル(オンラインマニュアル、man page)を表示するコマンドです。

マニュアルのセクション番号

マニュアルはセクション(章)ごとに分類されています。同じ名前でもセクションによって内容が異なることがあります(例:passwdはセクション1がコマンド、セクション5がファイル形式)。

セクション番号内容
1実行可能なプログラム・シェルコマンド
2システムコール(カーネルが提供する関数)
3ライブラリ関数
4特殊ファイル(/dev以下など)
5ファイル形式・設定ファイルの書式(/etc/passwd等)
6ゲーム
7その他(マクロパッケージ等)
8システム管理コマンド(主にroot向け)

特定のセクションを明示的に指定したい場合は、セクション番号をmanの引数の前に付けます。

man 5 passwd    # /etc/passwdのファイル形式についてのマニュアルを表示する
man 1 passwd    # passwdコマンドについてのマニュアルを表示する

キーワードで検索する:-k、-f

オプション効果
-k キーワードマニュアルの短い説明文(NAME)からキーワードを含むものを検索する(aproposコマンドとほぼ同等)
-f キーワード指定した名前に完全一致するマニュアルの短い説明文を表示する(whatisコマンドとほぼ同等)
man -k partition    # 「partition」を説明文に含むマニュアルページを検索する
man -f passwd        # passwdという名前のマニュアルページの短い説明を表示する

システム情報を確認する:uname

unameは、カーネルやシステムに関する基本的な情報を表示するコマンドです。

主なオプション効果
(オプション無し)または-sカーネル名を表示する(既定の動作)
-a利用可能なすべての情報をまとめて表示する
-nネットワーク上のホスト名を表示する
-rカーネルのリリース番号を表示する
-vカーネルのバージョン情報を表示する
-mマシンのハードウェア名(アーキテクチャ。例:x86_64)を表示する
-oオペレーティングシステム名を表示する
uname -a
# Linux myhost 6.1.0-generic #1 SMP ... x86_64 GNU/Linux

コマンド履歴:historyと.bash_history

対話的なシェルは、実行したコマンドの履歴を記録し、再利用できるようにしています。

historyコマンドと.bash_history

Bashのhistoryコマンドは、現在のシェルセッションで記録されているコマンド履歴を一覧表示します。Bashでは、履歴はセッション終了時(またはhistory -a等の明示的な操作)に、既定では~/.bash_historyファイルへ書き込まれます。

history        # 履歴の一覧を表示する
history 10     # 直近10件だけを表示する

履歴に関する主なシェル変数は次のとおりです。

シェル変数役割
HISTSIZE現在のシェルセッションのメモリ上に保持する履歴の件数(既定は500)
HISTFILESIZE~/.bash_historyファイルに保存する履歴の最大行数

履歴の再実行:イベント指示子

Bashでは、!から始まるイベント指示子を使って、履歴中のコマンドを呼び出して再実行できます。

記法効果
!!直前に実行したコマンドを再実行する(!-1と同じ)
!n履歴一覧のn番目のコマンドを再実行する
!-n現在からn個前のコマンドを再実行する
!文字列指定した文字列で始まる、直近のコマンドを再実行する
!?文字列指定した文字列を含む、直近のコマンドを再実行する
sudo !!          # 直前のコマンドをsudo付きで再実行する(権限不足で失敗した直後によく使われる)
!ping            # 直近に実行した「ping」で始まるコマンドを再実行する

対話的な検索には、キーボードショートカットCtrl+R(reverse-i-search)を使うと、入力した文字列を含む過去のコマンドを履歴からインクリメンタルに検索できます。

定義されたパスの内外でコマンドを呼び出す

外部コマンドをコマンド名だけで入力して実行できるのは、シェルがPATH環境変数に設定されたディレクトリを順に検索して見つけた場合です。PATHに含まれないディレクトリにあるコマンド(カレントディレクトリのスクリプトなど)を実行するには、./script.shのように相対パスまたは絶対パスを明示する必要がありますPATH環境変数の仕組みそのもの、および.(カレントディレクトリ)をPATHに含めることのセキュリティ上の注意点は、「Bashシェルスクリプトの基礎」の技術解説記事で扱っています。[1]。

myscript.sh      # PATHに含まれていない場合は「command not found」になる
./myscript.sh    # カレントディレクトリを明示すれば実行できる(実行権限が必要)
/opt/tools/myscript.sh    # 絶対パスを指定してもよい

補足

  1. PATH環境変数の仕組みそのもの、および.(カレントディレクトリ)をPATHに含めることのセキュリティ上の注意点は、「Bashシェルスクリプトの基礎」の技術解説記事で扱っています。 ↩