クォート(引用符)の使い分け
シェルは、コマンドラインに入力した文字列に対して、変数展開・コマンド置換・ワイルドカード展開などのさまざまな処理(展開)を行ってから実際のコマンドを実行します。クォート(引用符)は、この展開の一部または全部を抑制するために使います。
| 種類 | 記法 | 展開の扱い |
|---|---|---|
| シングルクォート | '...' | 内部の文字列をすべてそのまま(リテラル)として扱う。変数展開・コマンド置換も行われない |
| ダブルクォート | "..." | 変数展開($変数名)とコマンド置換(`...` や$(...))は行われるが、ワイルドカード展開(*等)や単語分割は抑制される |
| バックスラッシュ | \文字 | クォートされていないバックスラッシュは、直後の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 # 絶対パスを指定してもよい