Bash (日本語) - ArchWiki

# Bash (日本語)

関連記事

- Bash/関数
- 環境変数
- Readline
- Color Bash Prompt
- Fortune
- Pkgfile#Command not found

Bash (Bourne-again Shell) は GNU Project によるコマンドラインシェル・プログラミング言語です。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` も読み込みます。

Note: インタラクティブだが、ログインシェルでない場合は `~/.bash_profile` は読み込まれませんが、親プロセス (ログインシェルでもあり得る) の環境は承継されます。詳しくは [1] を参照。

順序の完全な説明は `man 1 bash` や [2] の INVOCATION セクションを見て下さい。

### シェルと環境変数

Bash と Bash によって実行されたプログラムの挙動は様々な環境変数によって左右されます。環境変数を使うことでコマンドの検索ディレクトリや使用するブラウザなどの有用な値を保存することができます。新しいシェルやスクリプトが起動されると親の変数が継承され、シェル変数の内部セットを使ってスタートします [3]。

Bash のシェル変数は環境変数にするためにエクスポートすることが可能です:

    VARIABLE=content
    export VARIABLE

もしくはショートカットを使って:

    export VARIABLE=content

環境変数は `~/.profile` や `/etc/profile` に記述するのがしきたりで、全ての bourne 互換シェルはこれらのファイルを使用します。

詳しくは Environment variables を参照してください。

## コマンドライン

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#History と 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 Tips (日本語)#ショートカット を見て下さい。

関数については、Bash/Functions を参照。

## 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 プロンプトで有用です。詳しくは、次を参照: Color Bash Prompt。

#### タイトルのカスタマイズ

`$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

これで adom で `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

## 参照

- 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
- Bash Scripting by Example
- Quote Tutorial
- Introduction to Bash

### コミュニティ

- An active and friendly IRC channel for Bash
- Bashscripts.org

### サンプル

- How to change the title of an xterm

Category:

- Command shells (日本語)