「Bash」の版間の差分
22行目: | 22行目: | ||
tty における {{ic|login}} や [[SSH]] デーモンによって Bash が実行された場合、それは'''ログインシェル'''です。このモードは {{ic|-l}} もしくは {{ic|--login}} コマンドラインオプションを使うことでも呼び出すことができます。 |
tty における {{ic|login}} や [[SSH]] デーモンによって Bash が実行された場合、それは'''ログインシェル'''です。このモードは {{ic|-l}} もしくは {{ic|--login}} コマンドラインオプションを使うことでも呼び出すことができます。 |
||
− | {{ic|-c}} オプションや何もオプションを付けずに実行された場合の Bash は'''インタラクティブシェル'''です。標準入力やエラーはターミナルに接続されます。 |
+ | {{ic|-c}} オプションをつけずに実行された場合や何もオプションを付けずに実行された場合の Bash は'''インタラクティブシェル'''です。標準入力やエラーはターミナルに接続されます。 |
=== レガシーモード === |
=== レガシーモード === |
2015年12月20日 (日) 08:26時点における版
Bash (Bourne-again Shell) は GNU プロジェクトによるコマンドラインシェル・プログラミング言語です。Bash という名前は先祖の名前のオマージュから来ています: 長い間非推奨であった Bourne shell です。Bash は GNU/Linux を含む様々な UNIX ライクなオペレーティングシステムで動作します。
実行
Bash の挙動は呼び出し方によって変わります。以下では様々なモードの説明を行います。
tty における login
や SSH デーモンによって Bash が実行された場合、それはログインシェルです。このモードは -l
もしくは --login
コマンドラインオプションを使うことでも呼び出すことができます。
-c
オプションをつけずに実行された場合や何もオプションを付けずに実行された場合の Bash はインタラクティブシェルです。標準入力やエラーはターミナルに接続されます。
レガシーモード
Arch では /bin/sh
(Bourne shell の実行ファイルとして使用されていました) は /bin/bash
にシンボリックリンクされています。Bash が sh
という名前で起動された場合、POSIX 互換の伝統的な sh
の始動時の挙動を模倣します。
レガシーモードで実行されたログインシェルは /etc/profile
、そして ~/.profile
を読み込みます。
設定ファイル
ファイル | ファイルのコマンドが読み込まれて実行 (source) される時 |
---|---|
/etc/profile
|
ログインシェルでもあるインタラクティブシェル (例えば、/usr/bin/login )。/etc/profile.d/*.sh や /etc/bash.bashrc に記述されたアプリケーションの設定を読み込みます。
|
/etc/bash.bashrc
|
インタラクティブシェル (例えば、ターミナルエミュレータ)。-DSYS_BASHRC="/etc/bash.bashrc" コンパイルフラグに依存します。/usr/share/bash-completion/bash_completion を読み込みます。
|
~/.bash_profile
|
ログインシェルでもあるインタラクティブシェル。/etc/profile の後にユーザー別で読み込まれます。ファイルが存在しない場合は ~/.bash_login と ~/.profile がこの順番でチェックされます。スケルトンファイル /etc/skel/.bash_profile は ~/.bashrc も読み込みます。
|
~/.bashrc
|
インタラクティブシェル。/etc/bash.bashrc の後にユーザー別で読み込まれます。
|
~/.bash_logout
|
ログインシェルが終了した後。 |
手短に言えば、全てのインタラクティブシェルは /etc/bash.bashrc
と ~/.bashrc
を読み込み、インタラクティブなログインシェルはそれに加えて /etc/profile
と ~/.bash_profile
も読み込みます。
順序の完全な説明は man 1 bash
や [2] の INVOCATION セクションを見て下さい。
シェルと環境変数
Bash と Bash によって実行されたプログラムの挙動は様々な環境変数によって左右されます。環境変数を使うことでコマンドの検索ディレクトリや使用するブラウザなどの有用な値を保存することができます。新しいシェルやスクリプトが起動されると親の変数が継承され、シェル変数の内部セットを使ってスタートします [3]。
Bash のシェル変数は環境変数にするためにエクスポートすることが可能です:
VARIABLE=content export VARIABLE
もしくはショートカットを使って:
export VARIABLE=content
環境変数は ~/.profile
や /etc/profile
に記述するのがしきたりで、全ての bourne 互換シェルはこれらのファイルを使用します。
詳しくは環境変数を参照してください。
コマンドライン
Bash のコマンドラインは Readline という名前の別のライブラリによって処理されています。Readline にはコマンドラインを使用するための多数のショートカットがあります。単語ごとに前後に移動、単語の削除など。また、入力したコマンドの履歴を管理するのも Readline の仕事です。最後に、また重要なことですが、Readline はマクロを作成するのを可能にします。
タブ補完
タブ補完は Tab
を二回押すことによって途中まで入力したコマンドを自動で補完するオプションです (デフォルトで有効)。
シングルタブ機能
複数の補完候補があるときに Tab
を一回押して表示するようにするには:
~/.inputrc
set show-all-if-ambiguous on
また、補完ができないときに候補を表示するには:
~/.inputrc
set show-all-if-unmodified on
プログラムとオプションを追加
Bash がネイティブでタブ補完をサポートしているのは: コマンド, ファイル名, 変数です。この機能は bash-completion パッケージで拡張することができます。このパッケージは人気のコマンドやそのオプションのタブ補完のサブセットを追加して機能を拡張します。bash-completion を使った場合、通常の補完は挙動が少し変わるので注意してください ($ ls file.*<tab><tab>
など)。ただし、$ compopt -o bashdefault <prog>
で再度有効にすることができます (詳しくは [4] や [5] を参照)。また、古いシステムでは bash-completion はあまり役に立たないかもしれません。
プログラムとオプションを手動で追加
complete -cf your_command
という形式の行を使って基本的な補完ができます (bash-completion の設定と衝突します):
~/.bashrc
complete -cf sudo complete -cf man
履歴補完
履歴補完は矢印キー (下と上) で使います (参照: Readline#履歴 と Readline Init File Syntax):
~/.bashrc
bind '"\e[A": history-search-backward' bind '"\e[B": history-search-forward'
or:
~/.inputrc
"\e[A": history-search-backward "\e[B": history-search-forward
Ctrl による高速な単語移動
Bash では Ctrl+Left
と Ctrl+Right
を使って単語ごとに素早く移動できるようにすることができます。
~/.inputrc
"\e[1;5C": forward-word "\e[1;5D": backward-word "\e[5C": forward-word "\e[5D": backward-word "\e\e[C": forward-word "\e\e[D": backward-word
Zsh の run-help 機能
Zsh では Alt+h
を押すことで入力したコマンドのマニュアルを呼び出すことができます。同じことは Bash でも以下の行を inputrc
ファイルに追加することで可能です:
/etc/inputrc
"\eh": "\C-a\eb\ed\C-y\e#man \C-y\C-m\C-p\C-p\C-a\C-d\C-e"
エイリアス
alias は特定の単語を別の文字列で置き換えるコマンドです。システムコマンドを短縮したり、日頃使っているコマンドにデフォルトの引数を追加するのに使用します。
個人的なエイリアスはなるべく ~/.bashrc
に保存し、システム全体の (全てのユーザーに影響を与える) エイリアスは /etc/bash.bashrc
に記述します。エイリアスの例は [6] や Pacman ヒント#ショートカット を見て下さい。
関数については、Bash/関数を参照。
Tips and tricks
プロンプトのカスタマイズ
Bash のプロンプトは $PS1
変数で変わります。Bash プロンプトをカラー化したい場合、以下を使って下さい:
~/.bashrc
#PS1='[\u@\h \W]\$ ' # To leave the default one #DO NOT USE RAW ESCAPES, USE TPUT reset=$(tput sgr0) red=$(tput setaf 1) blue=$(tput setaf 4) green=$(tput setaf 2) PS1='\[$red\]\u\[$reset\] \[$blue\]\w\[$reset\] \[$red\]\$ \[$reset\]\[$green\] '
上の $PS1
は赤色の記号と緑色のコンソールテキストの root の Bash プロンプトで有用です。詳しくは、次を参照: Bash カラープロンプト。
タイトルのカスタマイズ
$PROMPT_COMMAND
変数を使うことでプロンプトの前にコマンドを実行することができます。例えば、タイトルを現在のカレントディレクトリに変更:
~/.bashrc
export PROMPT_COMMAND='echo -ne "\033]0;$PWD\007"'
以下の設定はタイトルを最後に実行したコマンドに変更します、history ファイルが常に最新か確認してください:
~/.bashrc
export HISTCONTROL=ignoreboth export HISTIGNORE='history*' export PROMPT_COMMAND='history -a;echo -en "\e]2;";history 1|sed "s/^[ \t]*[0-9]\{1,\} //g";echo -en "\e\\";'
ターミナルで Ctrl+z を無効化
コマンドを以下のようにすることで Ctrl+z
機能 (アプリケーションの停止/終了) を無効化できます:
#!/bin/bash trap "" 20 adom
これで adomAUR で Shift+z
の代わりに間違って Ctrl+z
を押してしまっても Ctrl+z
は無視されるため何も起こりません。
ログアウト後に画面をクリア
仮想ターミナルでログアウト後に画面を消去するには:
~/.bash_logout
clear reset
ASCII カレンダー
calendar ファイルを ~/.calendar
ディレクトリにインストールするには rpmextract パッケージが必要になります。インストールしたらホームディレクトリから、以下を実行してください:
$ mkdir -p ~/.calendar $ curl -o calendar.rpm ftp://ftp.univie.ac.at/systems/linux/fedora/epel/5/x86_64/calendar-1.25-4.el5.x86_64.rpm $ rpm2cpio calendar.rpm | bsdtar -C ~/.calendar --strip-components=4 -xf - ./usr/share/c*
次のコマンドでカレンダーアイテムを出力します:
$ sed -n "/$(date +%m\\/%d\\\|%b\*\ %d)/p" $(find ~/.calendar /usr/share/calendar -maxdepth 1 -type f -name 'c*' 2>/dev/null);
パスを入力したら自動で "cd"
シェルにパスだけを入力したとき Bash に cd
を自動で前につけるようにすることができます。例えば:
$ /etc
bash: /etc: Is a directory
しかし以下の設定をすると:
~/.bashrc
shopt -s autocd
次の通り:
[user@host ~] $ /etc cd /etc [user@host etc]
トラブルシューティング
ウィンドウをリサイズした時の行の折り返し
ターミナルエミュレータのウィンドウサイズを変更した時、Bash はリサイズシグナルを受け取れないことがあります。そうすると入力したテキストが正しく折り返されずにプロンプトをはみ出してしまいます。checkwinsize
シェルオプションはコマンドごとにウィンドウサイズの確認を行い、必要ならば、LINES
と COLUMNS
の値を更新します。
~/.bashrc
shopt -s checkwinsize
ignoreeof が設定されているのにシェルが終了する
ignoreeof
オプションを設定したのに何度も ctrl-d
を押すとシェルが終了するのは、このオプションではこのキーバインド (正確には EOF 文字列) を押しても10回まではシェルが終了しないようになっているためです。
回数を上げるには、IGNOREEOF 変数を設定してください。例:
export IGNOREEOF=100
参照
- Bash Reference
- Bash manual page
- Readline Init File Syntax
- The Bourne-Again Shell - The third chapter of The Architecture of Open Source Applications
- Shellcheck - Check bash scripts for common errors
チュートリアル
- BashGuide on Greg's Wiki
- BashFAQ on Greg's Wiki
- Bash Hackers Wiki
- Advanced Bash Scripting Guide
- Quote Tutorial
- Introduction to Bash