「Bash」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(同期)
8行目: 8行目:
 
{{Related articles start}}
 
{{Related articles start}}
 
{{Related|Bash/関数}}
 
{{Related|Bash/関数}}
  +
{{Related|Bash/プロンプトのカスタマイズ}}
 
{{Related|環境変数}}
 
{{Related|環境変数}}
 
{{Related|Readline}}
 
{{Related|Readline}}
{{Related|Bash カラープロンプト}}
 
 
{{Related|Fortune}}
 
{{Related|Fortune}}
 
{{Related|Pkgfile#"Command not found" フック}}
 
{{Related|Pkgfile#"Command not found" フック}}
81行目: 81行目:
 
=== タブ補完 ===
 
=== タブ補完 ===
   
[[Wikipedia:Command-line_completion|タブ補完]]は {{ic|Tab}} を回押すことによって途中まで入力したコマンドを自動で補完するオプションです (デフォルトで有効)。
+
[[Wikipedia:Command-line_completion|タブ補完]]は {{ic|Tab}} を複数回押すことによって途中まで入力したコマンドを自動で補完するオプションです (デフォルトで有効)。
   
 
==== シングルタブ機能 ====
 
==== シングルタブ機能 ====
   
  +
コマンドの補完を全て表示するにはタブを最大3回押す必要があります。タブを押す回数を減らしたい場合は [[Readline#高速な補完]]を読んでください。
複数の補完候補があるときに {{ic|Tab}} を一回押して表示するようにするには:
 
 
{{hc|~/.inputrc|
 
set show-all-if-ambiguous on
 
}}
 
 
また、補完ができないときに候補を表示するには:
 
 
{{hc|~/.inputrc|
 
set show-all-if-unmodified on
 
}}
 
   
 
==== プログラムとオプションを追加 ====
 
==== プログラムとオプションを追加 ====
   
Bash がネイティブでタブ補完をサポートしているのは: コマンド, ファイル名, 変数です。この機能は {{Pkg|bash-completion}} パッケージで拡張するができます。このパッケージは人気のコマンドやそのオプションのタブ補完のサブセットを追加して機能を拡張します。{{Pkg|bash-completion}} を使った場合、通常の補完は挙動が少し変わるので注意してください ({{ic|$ ls file.*<tab><tab>}} など)。ただし、{{ic|$ compopt -o bashdefault <prog>}} で再度有効にすことができます (詳しくは [https://bbs.archlinux.org/viewtopic.php?id=128471] や [https://www.gnu.org/software/bash/manual/html_node/Programmable-Completion-Builtins.html] を参照)。また、古いシステムでは {{Pkg|bash-completion}} はあまり役に立たないかもしれません
+
デフォルトでは、Bash が補完るのはコマンドファイル名変数だけです。{{Pkg|bash-completion}} パッケージをインストールすると一般的によく使われるコマンドやオプションのタブ補完追加されます。{{Pkg|bash-completion}} をインストールした場合、({{ic|$ ls file.*<tab><tab>}} など) 通常の補完も変わりますが、{{ic|$ compopt -o bashdefault ''program''}} ですことができます (詳しくは [https://bbs.archlinux.org/viewtopic.php?id=128471] や [https://www.gnu.org/software/bash/manual/html_node/Programmable-Completion-Builtins.html] を参照)。
   
 
==== プログラムとオプションを手動で追加 ====
 
==== プログラムとオプションを手動で追加 ====
   
{{ic|complete -cf your_command}} という形式の行を使って基本的な補完ができま({{Pkg|bash-completion}} の設定と衝突ます):
+
{{Note|{{ic|complete}} を使ると {{Pkg|bash-completion}} と衝突する可能性があります。}}
   
  +
デフォルトでは Bash はコマンドの後のファイル名しか補完しません。{{ic|complete -c}} を使うことでコマンド名も補完するようにできます:
 
{{hc|~/.bashrc|
 
{{hc|~/.bashrc|
complete -cf sudo
+
complete -c man which
complete -cf man
 
 
}}
 
}}
  +
もしくはコマンド名とファイル名を補完するには {{ic|-cf}} を使用:
  +
{{bc|complete -cf sudo}}
  +
詳しくは Bash の man ページを見てください。
   
 
=== 履歴補完 ===
 
=== 履歴補完 ===
   
履歴補完は矢印キー (下と上) で使ます (参照: [[Readline#履歴]] と [https://www.gnu.org/software/bash/manual/html_node/Readline-Init-File-Syntax.html Readline Init File Syntax]):
+
履歴補完は矢印キー (下と上) で使うことができます (参照: [[Readline#履歴]]と [https://www.gnu.org/software/bash/manual/html_node/Readline-Init-File-Syntax.html Readline Init File Syntax]):
   
 
{{hc|~/.bashrc|
 
{{hc|~/.bashrc|
119行目: 112行目:
 
}}
 
}}
   
  +
Readline プログラム全てに適用するには:
or:
 
   
 
{{hc|~/.inputrc|
 
{{hc|~/.inputrc|
125行目: 118行目:
 
"\e[B": history-search-forward
 
"\e[B": history-search-forward
 
}}
 
}}
  +
  +
==== 履歴を短くする ====
  +
  +
{{ic|HISTCONTROL}} 変数を使うことで履歴に特定のコマンドが記録されないようにできます。例えば、同じコマンドが重複して記録されないようにするには:
  +
{{hc|~/.bashrc|2=export HISTCONTROL=ignoredups}}
  +
{{ic|erasedups}} に設定すると (コマンドが実行された順番と関係なく) Bash の履歴に同じコマンドが含まれないようになります。詳しくは Bash の man ページを見てください。
   
 
=== Ctrl による高速な単語移動 ===
 
=== Ctrl による高速な単語移動 ===
   
  +
[[Readline#高速な単語移動]]を見てください。
Bash では {{ic|Ctrl+Left}} と {{ic|Ctrl+Right}} を使って単語ごとに素早く移動できるようにすることができます。
 
 
{{hc|~/.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 の run-help 機能 ===
   
Zsh では {{ic|Alt+h}} を押すことで入力したコマンドのマニュアルを呼び出すことができます。同じこと Bash でも以下の行を {{ic|inputrc}} ファイル追加することで可能です:
+
Zsh では {{ic|Alt+h}} を押すことで入力したコマンドのマニュアルを呼び出すことができます。[[Readline]] の bind を使うこと Bash でも同じよう使えます:
{{hc|/etc/inputrc|
+
{{hc|~/.bashrc|
"\eh": "\C-a\eb\ed\C-y\e#man \C-y\C-m\C-p\C-p\C-a\C-d\C-e"
+
bind '"\eh": "\C-a\eb\ed\C-y\e#man \C-y\C-m\C-p\C-p\C-a\C-d\C-e"'
 
}}
 
}}
  +
上記では (デフォルトの) Emacs [[Readline#編集モード|編集モード]]を使用しています。
   
 
== エイリアス ==
 
== エイリアス ==
150行目: 141行目:
 
[[Wikipedia:Alias_(command)|alias]] は特定の単語を別の文字列で置き換えるコマンドです。システムコマンドを短縮したり、日頃使っているコマンドにデフォルトの引数を追加するのに使用します。
 
[[Wikipedia:Alias_(command)|alias]] は特定の単語を別の文字列で置き換えるコマンドです。システムコマンドを短縮したり、日頃使っているコマンドにデフォルトの引数を追加するのに使用します。
   
個人的なエイリアスはなるべく {{ic|~/.bashrc}} に保存し、システム全体の (全てのユーザーに影響を与える) エイリアスは {{ic|/etc/bash.bashrc}} に記述します。エイリアスの例は [https://gist.github.com/anonymous/a9055e30f97bd19645c2] や [[Pacman ヒント#ショートカット]] を見てさい。
+
個人的なエイリアスはなるべく {{ic|~/.bashrc}} に保存し、システム全体の (全てのユーザーに影響を与える) エイリアスは {{ic|/etc/bash.bashrc}} に記述します。エイリアスの例は [https://gist.github.com/anonymous/a9055e30f97bd19645c2] を見てください。
   
 
関数については、[[Bash/関数]]を参照。
 
関数については、[[Bash/関数]]を参照。
158行目: 149行目:
 
=== プロンプトのカスタマイズ ===
 
=== プロンプトのカスタマイズ ===
   
Bashプロンプトは {{ic|$PS1}} 変数で変わります。Bash プロンプトをラー化したい場合、以下使っさい:
+
[[Bash/プロンプトスタマイズ]]ください
{{hc|~/.bashrc|2=
 
#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\] '
 
}}
 
上の {{ic|$PS1}} は赤色の記号と緑色のコンソールテキストの root の Bash プロンプトで有用です。詳しくは、次を参照: [[Bash カラープロンプト]]。
 
 
==== タイトルのカスタマイズ ====
 
 
{{ic|$PROMPT_COMMAND}} 変数を使うことでプロンプトの前にコマンドを実行することができます。例えば、タイトルを現在のカレントディレクトリに変更:
 
 
{{hc|~/.bashrc|<nowiki>
 
export PROMPT_COMMAND='echo -ne "\033]0;$PWD\007"'
 
</nowiki>}}
 
 
以下の設定はタイトルを最後に実行したコマンドに変更します、history ファイルが常に最新か確認してください:
 
{{hc|~/.bashrc|<nowiki>
 
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\\";'
 
</nowiki>}}
 
   
 
=== ターミナルで Ctrl+z を無効化 ===
 
=== ターミナルで Ctrl+z を無効化 ===
203行目: 168行目:
 
reset
 
reset
 
}}
 
}}
 
=== ASCII カレンダー ===
 
 
[http://www.openbsd.org/cgi-bin/man.cgi?query=calendar&sektion=1 calendar] ファイルを {{ic|~/.calendar}} ディレクトリにインストールするには {{Pkg|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" ===
 
=== パスを入力したら自動で "cd" ===
   
シェルにパスだけを入力したとき Bash に {{ic|cd }} を自動で前につけるようにすることができます。例えば:
+
シェルにパスだけを入力したとき Bash に {{ic|cd }} を自動で前につけるようにすることができます。例えば通常は以下のようになりますが:
 
{{hc|$ /etc|
 
{{hc|$ /etc|
 
bash: /etc: Is a directory
 
bash: /etc: Is a directory
 
}}
 
}}
   
しかし以下の設定をすると:
+
{{ic|.bashrc}} に以下の設定を追加すると:
 
{{hc|~/.bashrc|
 
{{hc|~/.bashrc|
 
shopt -s autocd
 
shopt -s autocd
232行目: 185行目:
 
cd /etc
 
cd /etc
 
[user@host etc]
 
[user@host etc]
  +
  +
=== Autojump ===
  +
  +
{{Pkg|autojump}} を使うことでユーザーが頻繁に使用しているパスが記録されたデータベースを検索してファイルシステムを移動できます。
  +
  +
パッケージをインストールしたら {{ic|/etc/profile.d/autojump.bash}} を [[source]] することで使えるようになります。
   
 
== トラブルシューティング ==
 
== トラブルシューティング ==
252行目: 211行目:
 
== 参照 ==
 
== 参照 ==
   
* [https://www.gnu.org/software/bash/manual/bashref.html Bash Reference]
+
* [https://www.gnu.org/software/bash/manual/bashref.html Bash Reference Manual] または {{ic|/usr/share/doc/bash/bashref.html}}
* [https://www.gnu.org/software/bash/manual/bash.html Bash manual page]
 
 
* [https://www.gnu.org/software/bash/manual/html_node/Readline-Init-File-Syntax.html Readline Init File Syntax]
 
* [https://www.gnu.org/software/bash/manual/html_node/Readline-Init-File-Syntax.html Readline Init File Syntax]
* [http://www.aosabook.org/en/bash.html The Bourne-Again Shell] - The third chapter of ''The Architecture of Open Source Applications''
+
* [http://www.aosabook.org/en/bash.html The Bourne-Again Shell] - ''The Architecture of Open Source Applications'' の第3章
 
* [http://shellcheck.net Shellcheck] - Check bash scripts for common errors
 
* [http://shellcheck.net Shellcheck] - Check bash scripts for common errors
   
263行目: 221行目:
 
* [http://mywiki.wooledge.org/BashFAQ BashFAQ on Greg's Wiki]
 
* [http://mywiki.wooledge.org/BashFAQ BashFAQ on Greg's Wiki]
 
* [http://wiki.bash-hackers.org/doku.php Bash Hackers Wiki]
 
* [http://wiki.bash-hackers.org/doku.php Bash Hackers Wiki]
* [http://tldp.org/LDP/abs/html/ Advanced Bash Scripting Guide]
+
* [http://wiki.bash-hackers.org/scripting/tutoriallist Bash Hackers: List of Bash online-tutorials]
 
* [http://www.grymoire.com/Unix/Quote.html Quote Tutorial]
 
* [http://www.grymoire.com/Unix/Quote.html Quote Tutorial]
* [http://linuxtutorial.todolistme.net Introduction to Bash]
 
   
 
=== コミュニティ ===
 
=== コミュニティ ===

2017年1月7日 (土) 20:44時点における版

関連記事

Bash (Bourne-again Shell) は GNU プロジェクトによるコマンドラインシェル・プログラミング言語です。Bash という名前は先祖の名前のオマージュから来ています: 長い間非推奨であった Bourne shell です。Bash は GNU/Linux を含む様々な UNIX ライクなオペレーティングシステムで動作します。

実行

Bash の挙動は呼び出し方によって変わります。以下では様々なモードの説明を行います。

tty における loginSSH デーモンによって 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 も読み込みます。

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

順序の完全な説明は 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 を複数回押すことによって途中まで入力したコマンドを自動で補完するオプションです (デフォルトで有効)。

シングルタブ機能

コマンドの補完を全て表示するにはタブを最大3回押す必要があります。タブを押す回数を減らしたい場合は Readline#高速な補完を読んでください。

プログラムとオプションを追加

デフォルトでは、Bash が補完するのはコマンドとファイル名、変数だけです。bash-completion パッケージをインストールすると一般的によく使われるコマンドやオプションのタブ補完も追加されます。bash-completion をインストールした場合、($ ls file.*<tab><tab> などの) 通常の補完も変わりますが、$ compopt -o bashdefault program で元に戻すことができます (詳しくは [4][5] を参照)。

プログラムとオプションを手動で追加

ノート: complete を使用すると bash-completion と衝突する可能性があります。

デフォルトでは Bash はコマンドの後のファイル名しか補完しません。complete -c を使うことでコマンド名も補完するようにできます:

~/.bashrc
complete -c man which

もしくはコマンド名とファイル名を補完するには -cf を使用:

complete -cf sudo

詳しくは Bash の man ページを見てください。

履歴補完

履歴補完は矢印キー (下と上) で使うことができます (参照: 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

erasedups に設定すると (コマンドが実行された順番と関係なく) Bash の履歴に同じコマンドが含まれないようになります。詳しくは Bash の man ページを見てください。

Ctrl による高速な単語移動

Readline#高速な単語移動を見てください。

Zsh の run-help 機能

Zsh では Alt+h を押すことで入力したコマンドのマニュアルを呼び出すことができます。Readline の bind を使うことで Bash でも同じように使えます:

~/.bashrc
bind '"\eh": "\C-a\eb\ed\C-y\e#man \C-y\C-m\C-p\C-p\C-a\C-d\C-e"'

上記では (デフォルトの) Emacs 編集モードを使用しています。

エイリアス

alias は特定の単語を別の文字列で置き換えるコマンドです。システムコマンドを短縮したり、日頃使っているコマンドにデフォルトの引数を追加するのに使用します。

個人的なエイリアスはなるべく ~/.bashrc に保存し、システム全体の (全てのユーザーに影響を与える) エイリアスは /etc/bash.bashrc に記述します。エイリアスの例は [6] を見てください。

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

Tips and tricks

プロンプトのカスタマイズ

Bash/プロンプトのカスタマイズを見てください。

ターミナルで Ctrl+z を無効化

コマンドを以下のようにすることで Ctrl+z 機能 (アプリケーションの停止/終了) を無効化できます:

#!/bin/bash
trap "" 20
adom

これで adomAURShift+z の代わりに間違って Ctrl+z を押してしまっても Ctrl+z は無視されるため何も起こりません。

ログアウト後に画面をクリア

仮想ターミナルでログアウト後に画面を消去するには:

~/.bash_logout
clear
reset

パスを入力したら自動で "cd"

シェルにパスだけを入力したとき Bash に cd を自動で前につけるようにすることができます。例えば通常は以下のようになりますが:

$ /etc
bash: /etc: Is a directory

.bashrc に以下の設定を追加すると:

~/.bashrc
shopt -s autocd

次の通り:

[user@host ~] $ /etc
cd /etc
[user@host etc]

Autojump

autojump を使うことでユーザーが頻繁に使用しているパスが記録されたデータベースを検索してファイルシステムを移動できます。

パッケージをインストールしたら /etc/profile.d/autojump.bashsource することで使えるようになります。

トラブルシューティング

ウィンドウをリサイズした時の行の折り返し

ターミナルエミュレータのウィンドウサイズを変更した時、Bash はリサイズシグナルを受け取れないことがあります。そうすると入力したテキストが正しく折り返されずにプロンプトをはみ出してしまいます。checkwinsize シェルオプションはコマンドごとにウィンドウサイズの確認を行い、必要ならば、LINESCOLUMNS の値を更新します。

~/.bashrc
shopt -s checkwinsize

ignoreeof が設定されているのにシェルが終了する

ignoreeof オプションを設定したのに何度も ctrl-d を押すとシェルが終了するのは、このオプションではこのキーバインド (正確には EOF 文字列) を押しても10回まではシェルが終了しないようになっているためです。

回数を上げるには、IGNOREEOF 変数を設定してください。例:

export IGNOREEOF=100

参照

チュートリアル

コミュニティ

サンプル