Bash
Bash (Bourne-again Shell) は GNU プロジェクトによるコマンドラインシェル/プログラミング言語です。Bash という名前は、長い間非推奨であった Bourne shell という先祖の名前のオマージュから来ています。Bash は GNU/Linux を含むほとんどの UNIX ライクなオペレーティングシステムで動作します。
Bash は、Arch Linux のデフォルトのコマンドラインシェルです。
実行
Bash は、起動の仕方によって動作が変わります。以下、一部のモードについて説明します。
Bash が TTY 内で login
コマンドによって呼び出された場合や、SSH デーモンによって呼び出された場合、その他の似たような方法によって呼び出された場合、ログインシェルとみなされます。また、-l
/--login
コマンドラインオプションを使用した場合も、このモードが有効化されます。
Bash の標準入力、標準出力、そして標準エラー出力がターミナルに接続されていて (例えば、ターミナル内で実行された場合)、かつ、-c
オプションも非オプション引数 (例えば bash スクリプト
) も使用されずに起動された場合、インタラクティブシェルとみなされます。全てのインタラクティブシェルは /etc/bash.bashrc
と ~/.bashrc
を読み込んで実行します。一方、インタラクティブなログインシェルは、これらに加えて /etc/profile
と ~/.bash_profile
も読み込んで実行します。
設定ファイル
Bash は一連のスタートアップファイルを実行しようと試みます。読み込まれるファイルは、Bash がどのように実行されたかに依存します。完全な説明は、GNU Bash マニュアルの Bash Startup Files 章を参照してください。
ファイル | 説明 | ログインシェル (以下のノートを参照) | インタラクティブ (非ログインシェル) |
---|---|---|---|
/etc/profile
|
/etc/profile.d/*.sh と /etc/bash.bashrc のアプリケーションの設定を source します。
|
Yes | No |
~/.bash_profile
|
ユーザ毎の設定ファイルです。/etc/profile のあとに読み込まれます。このファイルが存在しない場合、~/.bash_login と ~/.profile がこの順番でチェックされます。スケルトンファイル /etc/skel/.bash_profile は ~/.bashrc も読み込みます。
|
Yes | No |
~/.bash_logout
|
ユーザ毎の設定ファイル。ログインシェルが終了する際に実行されます。 | Yes | No |
/etc/bash.bash_logout
|
このファイルが読み込まれるかどうかは、-DSYS_BASH_LOGOUT="/etc/bash.bash_logout" コンパイルフラグに依存します。ログインシェルの終了時に実行されます。
|
Yes | No |
/etc/bash.bashrc
|
このファイルが読み込まれるかどうかは、-DSYS_BASHRC="/etc/bash.bashrc" コンパイルフラグに依存します。このファイルは /usr/share/bash-completion/bash_completion を読み込みます。
|
No | Yes |
~/.bashrc
|
ユーザ毎の設定ファイル。/etc/bash.bashrc の後に読み込まれます。
|
No | Yes |
シェルと環境変数
Bash、及び Bash によって実行されるプログラムの動作は、様々な環境変数による影響を受ける可能性があります。環境変数は、コマンドが探索されるディレクトリのリストや、どのブラウザを使用するかなど、有用な値を保存するために使用されます。新しいシェルやスクリプトが実行された際、そのプロセスは親プロセスの変数を継承します。つまり、内部のシェル変数を持った状態で起動されるわけです [1]。
Bash 内のシェル変数を環境変数とするには、export する必要があります:
VARIABLE=content export VARIABLE
これは、以下のようにショートカットすることも可能です:
export VARIABLE=content
伝統的に環境変数は、他の Bourne 互換のシェルも使用できるようにするために、~/.profile
や /etc/profile
内で定義されます。
より一般的な情報は 環境変数 を参照してください。
コマンドライン
Bash のコマンドラインは Readline という名前の別のライブラリによって処理されています。Readline は、コマンドラインと対話 (つまり、単語単位で前後に移動したり、単語を削除したりなど) するための emacs や vi スタイルのショートカットを提供しています。また、入力したコマンドの履歴を管理するのも Readline の仕事です。最後に、また重要なことですが、Readline はマクロの作成も可能にします。
タブ補完
タブ補完とは、Tab
を押すことによって入力済みのコマンドを自動補完するオプションです (デフォルトで有効)。
シングルタブ
コマンドの補完候補を全て表示するにはタブを最大で3回押す必要があります。タブを押す回数を減らしたい場合は、Readline#高速な補完 を参照してください。
よく使われるプログラムとオプション
デフォルトでは、Bash によってタブ補完されるのはコマンド、ファイル名、そして変数のみです。bash-completion をインストールすると、よく使われるコマンドとオプションに対するタブ補完も追加されます。この補完は、/usr/share/bash-completion/bash_completion
を source することで有効化することができます (このファイルは Arch Linux の /etc/bash.bashrc
で既に source されています)。bash-completion を使うと、($ ls file.*<tab><tab>
などの) 通常の補完も挙動が変化しますが、$ compopt -o bashdefault program
によって元に戻すことができます (詳しくは [2] と [3] を参照)。
コマンド毎にカスタマイズする
デフォルトでは、Bash はコマンドの後のファイル名しかタブ補完しません。complete -c
を使うことで、コマンド名も補完できるようにできます:
~/.bashrc
complete -c man which
また、-cf
でコマンド名とファイル名を補完できます:
complete -cf sudo
その他の補完オプションは bash(1) § Programmable Completion を見てください。
履歴
履歴による補完
上下キーを Bash 履歴の検索に割り当てることができます (Readline#履歴 と Readline Init File Syntax を参照):
~/.bashrc
bind '"\e[A": history-search-backward' bind '"\e[B": history-search-forward'
あるいは、全ての readline プログラムに適用するには:
~/.inputrc
"\e[A": history-search-backward "\e[B": history-search-forward
履歴のカスタマイズ
HISTCONTROL
変数により、特定のコマンドを履歴に残さないようにできます。
連続する同じコマンドを記録しない:
~/.bashrc
export HISTCONTROL=ignoredups
同じコマンドは、一番最後を除いて記録しない:
~/.bashrc
export HISTCONTROL=erasedups
空白で始まるコマンドは記録しない:
~/.bashrc
export HISTCONTROL=ignorespace
連続する同じコマンド、及び空白で始まるコマンドは記録しない:
~/.bashrc
export HISTCONTROL=ignoreboth
同じコマンドは、一番最後を除いて記録せず、さらに空白で始まるコマンドも記録しない:
~/.bashrc
export HISTCONTROL="erasedups:ignorespace"
詳細は bash(1) § HISTCONTROL を参照してください。
履歴を無効にする
一時的に Bash の履歴を無効化するには:
$ set +o history
以降、入力されたコマンドは $HISTFILE
に記録されません。
これで、機密情報をディスクに残すことなく、printf シークレット | sha256sum
でパスワードのハッシュ値を計算したり、gpg -eaF secret-pubkey.asc
などの GPG の使用履歴を隠蔽したりできるようになります。
履歴を有効化するには:
$ set -o history
全ての Bash 履歴を無効化するには:
~/.bashrc or /etc/profile
export HISTSIZE=0
...そして、念のため、古い履歴ファイルを完全に削除してください:
$ wipe -i -l2 -x4 -p4 "$HISTFILE" $ ln -sv /dev/null "$HISTFILE"
Zsh の run-help 機能を模倣する
Zsh では Alt+h
を押すことで、入力したコマンドのマニュアルを呼び出すことができます。Readline の bind を使うことで Bash でも同じようにできます:
~/.bashrc
run-help() { help "$READLINE_LINE" 2>/dev/null || man "$READLINE_LINE"; } bind -m vi-insert -x '"\eh": run-help' bind -m emacs -x '"\eh": run-help'
上記では、(デフォルトの) Emacs 編集モードを使用していることを前提としています。
エイリアス
alias は、ある単語の別名を定義するコマンドです。システムコマンドを短縮したり、日頃使っているコマンドにデフォルトの引数を追加したりするために使用されます。
ユーザ毎のエイリアスは、~/.bashrc
に定義するか、別のファイルに記述して ~/.bashrc
からそのファイルを source することができます。システム全体で使用される (つまり、全てのユーザに適用される) エイリアスは /etc/bash.bashrc
に記述します。エイリアスの例は [4] を見てください。
関数については、Bash/関数 を参照してください。
ヒントとテクニック
プロンプトのカスタマイズ
Bash/プロンプトのカスタマイズ を見てください。
シンタックスハイライトとオートサジェスト機能
blesh-gitAUR は、純粋な Bash で記述されたコマンドラインエディタであり、Readline の置き換えです。シンタックスハイライト、オートサジェスト、メニュー補完、略語、Vim 編集モード、フック関数など、多くの強化された機能を備えています。
インストール後、対話型セッションで設定ファイルを source してください。設定は ~/.blerc ファイルと wiki で詳しく説明されています。安定版の bleshAUR パッケージも利用可能です。
Command not found
pkgfile には "command not found" フックが含まれており、認識できないコマンドが入力されると自動的に公式リポジトリを検索します。
このフックを有効化するには、source する必要があります。例:
~/.bashrc
source /usr/share/doc/pkgfile/command-not-found.bash
以降、利用できないコマンドを実行しようとすると、次のような情報が表示されるようになります:
$ abiword
abiword may be found in the following packages: extra/abiword 3.0.1-2 /usr/bin/abiword
ターミナルで Ctrl+z を無効化
以下のようにコマンドをラップすることで、Ctrl+z
機能 (アプリケーションの停止/終了) を無効化することができます:
#!/bin/bash trap "" 20 adom
これで、adomAUR で Shift+z
ではなく Ctrl+z
を間違って押しても、Ctrl+z
は無視されるため何も起こりません。
ログアウト後に画面をクリア
仮想コンソールでログアウト後に画面を消去するには:
~/.bash_logout
clear reset
パスを入力したら自動で "cd"
シェルにパスだけを入力したとき Bash に cd
を自動で前につけるようにすることができます。例えば通常は以下のようになりますが:
$ /etc
bash: /etc: ディレクトリです
.bashrc
に以下の設定を追加すると:
~/.bashrc
... shopt -s autocd ...
次の通り:
[user@host ~]$ /etc cd /etc [user@host etc]$
Autojump
autojump-gitAUR は、ユーザがよく訪れるパスが記録されたデータベースを検索することでファイルシステムの移動を速くできる Python スクリプトです。
zoxide はこれの代替品で、オリジナルの autojump
に比べてより多くの機能があり、パフォーマンスも優れているので、autojump の完全な代用として使うことができます。
ファイルの上書きを防止する
現在のセッション限定で、シェル出力のリダイレクトによる既存の通常ファイルへの上書きを禁止するには:
$ set -o noclobber
これは set -C
と同じです。
ユーザ毎にこの設定を永続化するには:
~/.bashrc
... set -o noclobber
noclobber
が設定されている状態でファイルを手動で上書きするには:
$ echo "output" >| file.txt
ディレクトリスタックを使用して移動する
pushd
と popd
を使用すると、ディレクトリに切り替えるときにスタックにディレクトリをプッシュまたはポップできます。これは、ナビゲーション履歴を リプレイ するのに役立ちます。
[user@host ~] pushd /tmp/dir1 [user@host /tmp/dir1] pushd /var/lib [user@host/var/lib] popd [user@host/tmp/dir1] popd [user@host ~]
bash(1) § DIRSTACK を参照してください。
GNU readline の代替品
ble.sh は、bleshAUR および blesh-gitAUR としてパックされており、純粋な Bash で書かれたフル機能のラインエディタです。
これは GNU readline の代替です。
シンタックス・ハイライト、強化された補完、vim 編集モードを提供し、ステータス行、履歴共有、右プロンプト、一時プロンプト、xterm タイトルなどのその他の興味深い機能も提供します。
トラブルシューティング
ウィンドウをリサイズした時の行の折り返し
ターミナルエミュレータのウィンドウサイズを変更した時、Bash はリサイズシグナルを受け取らないことがあります。そうすると入力したテキストが正しく折り返されずにプロンプトをはみ出してしまいます。checkwinsize
シェルオプションはコマンドごとにウィンドウサイズの確認を行い、必要ならば、LINES
と COLUMNS
の値を更新します。
~/.bashrc
shopt -s checkwinsize
ignoreeof が設定されているのにシェルが終了する
ignoreeof
オプションが設定されているのに、ctrl-d
を繰り返し入力するとシェルが終了してしまうのは、このオプションは ctrl-d
を連続10回押すと (厳密には連続する10個の EOF 文字が入力されると) シェルが終了するように設定することが原因です。
この回数をより多くするには、IGNOREEOF 変数を設定してください。例:
export IGNOREEOF=100
スクリプトを解析してエラーをチェックする
shellcheck パッケージは bash (及び他のシェル) のスクリプトを解析し、考えられるエラーを表示し、より良いコードを提案します。
また、このプログラムをベースにした同じ目的のウェブサイト shellcheck.net も存在します。
参照
- Wikipedia:ja:Bash
- Bash Reference Manual (あるいは
/usr/share/doc/bash/bashref.html
) - Readline Init File Syntax
- The Bourne-Again Shell - The Architecture of Open Source Applications の第3章
- PS1 generator - ドラッグアンドドロップのインターフェイスで .bashrc/PS1 Bash プロンプトを生成してくれます。
- その他の便利な .bashrc コマンド