「Bash」の版間の差分
(同期) |
|||
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 が |
+ | デフォルトでは、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 |
+ | {{Note|{{ic|complete}} を使用すると {{Pkg|bash-completion}} と衝突する可能性があります。}} |
+ | デフォルトでは Bash はコマンドの後のファイル名しか補完しません。{{ic|complete -c}} を使うことでコマンド名も補完するようにできます: |
||
{{hc|~/.bashrc| |
{{hc|~/.bashrc| |
||
− | complete - |
+ | 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]): |
{{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}} を押すことで入力したコマンドのマニュアルを呼び出すことができます。 |
+ | Zsh では {{ic|Alt+h}} を押すことで入力したコマンドのマニュアルを呼び出すことができます。[[Readline]] の bind を使うことで Bash でも同じように使えます: |
− | {{hc|/ |
+ | {{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 |
+ | 個人的なエイリアスはなるべく {{ic|~/.bashrc}} に保存し、システム全体の (全てのユーザーに影響を与える) エイリアスは {{ic|/etc/bash.bashrc}} に記述します。エイリアスの例は [https://gist.github.com/anonymous/a9055e30f97bd19645c2] を見てください。 |
関数については、[[Bash/関数]]を参照。 |
関数については、[[Bash/関数]]を参照。 |
||
158行目: | 149行目: | ||
=== プロンプトのカスタマイズ === |
=== プロンプトのカスタマイズ === |
||
− | 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] - |
+ | * [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:// |
+ | * [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 における 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
を複数回押すことによって途中まで入力したコマンドを自動で補完するオプションです (デフォルトで有効)。
シングルタブ機能
コマンドの補完を全て表示するにはタブを最大3回押す必要があります。タブを押す回数を減らしたい場合は Readline#高速な補完を読んでください。
プログラムとオプションを追加
デフォルトでは、Bash が補完するのはコマンドとファイル名、変数だけです。bash-completion パッケージをインストールすると一般的によく使われるコマンドやオプションのタブ補完も追加されます。bash-completion をインストールした場合、($ ls file.*<tab><tab>
などの) 通常の補完も変わりますが、$ compopt -o bashdefault program
で元に戻すことができます (詳しくは [4] や [5] を参照)。
プログラムとオプションを手動で追加
デフォルトでは 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
これで adomAUR で Shift+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.bash
を source することで使えるようになります。
トラブルシューティング
ウィンドウをリサイズした時の行の折り返し
ターミナルエミュレータのウィンドウサイズを変更した時、Bash はリサイズシグナルを受け取れないことがあります。そうすると入力したテキストが正しく折り返されずにプロンプトをはみ出してしまいます。checkwinsize
シェルオプションはコマンドごとにウィンドウサイズの確認を行い、必要ならば、LINES
と COLUMNS
の値を更新します。
~/.bashrc
shopt -s checkwinsize
ignoreeof が設定されているのにシェルが終了する
ignoreeof
オプションを設定したのに何度も ctrl-d
を押すとシェルが終了するのは、このオプションではこのキーバインド (正確には EOF 文字列) を押しても10回まではシェルが終了しないようになっているためです。
回数を上げるには、IGNOREEOF 変数を設定してください。例:
export IGNOREEOF=100
参照
- Bash Reference Manual または
/usr/share/doc/bash/bashref.html
- Readline Init File Syntax
- The Bourne-Again Shell - The Architecture of Open Source Applications の第3章
- Shellcheck - Check bash scripts for common errors
チュートリアル
- BashGuide on Greg's Wiki
- BashFAQ on Greg's Wiki
- Bash Hackers Wiki
- Bash Hackers: List of Bash online-tutorials
- Quote Tutorial