「Bash」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
 
(7人の利用者による、間の42版が非表示)
1行目: 1行目:
[[Category:コマンドシェル]]
+
[[Category:コマンドラインシェル]]
  +
[[Category:GNU]]
 
[[de:Bash]]
 
[[de:Bash]]
 
[[en:Bash]]
 
[[en:Bash]]
 
[[es:Bash]]
 
[[es:Bash]]
[[it:Bash]]
 
 
[[ru:Bash]]
 
[[ru:Bash]]
[[zh-CN:Bash]]
+
[[zh-hans:Bash]]
 
{{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}}
  +
{{Related|コマンドラインシェル}}
 
{{Related articles end}}
 
{{Related articles end}}
'''Bash''' (Bourne-again Shell) は [[GNU プロジェクト]]による[[シェル|コマンドラインシェル]]プログラミング言語です。Bash という名前は先祖の名前のオマージュから来ています: 長い間非推奨であった Bourne shell です。Bash は GNU/Linux を含む様々な UNIX ライクなオペレーティングシステムで動作します。
+
[https://www.gnu.org/software/bash/ Bash] (Bourne-again Shell) は [[GNU プロジェクト]]による[[コマンドラインシェル]]/プログラミング言語です。Bash という名前は、長い間非推奨であった Bourne shell という先祖の名前のオマージュから来ています。Bash は GNU/Linux を含むほとんどの UNIX ライクなオペレーティングシステムで動作します。
  +
  +
Bash は、Arch Linux のデフォルトのコマンドラインシェルです。
   
 
== 実行 ==
 
== 実行 ==
   
Bash の挙動呼び出し方によって変わります。以下では様々なモード説明を行います。
+
Bash は、起動の仕方によって動作が変わります。以下、一部のモードについて説明ます。
   
tty における {{ic|login}} や [[SSH]] デーモンによって Bash が実行された場合、それ'''ログインシェル'''す。このモードは {{ic|-l}} もしくは {{ic|--login}} コマンドラインオプションを使うことで呼び出すできます。
+
Bash が TTY 内で {{ic|login}} コマンドによって呼び出された場合[[SSH]] デーモンによって呼び出された場合、その他の似たような方法によって呼び出さた場合、'''ログインシェル'''とみなされます。また、{{ic|-l}}/{{ic|--login}} コマンドラインオプションを使用した場合のモード有効化されます。
   
  +
Bash の標準入力、標準出力、そして標準エラー出力がターミナルに接続されていて (例えば、ターミナル内で実行された場合)、かつ、{{ic|-c}} オプションも[https://unix.stackexchange.com/a/96805 非オプション]引数 (例えば {{ic|bash '''スクリプト'''}}) も使用されずに起動された場合、'''インタラクティブシェル'''とみなされます。全てのインタラクティブシェルは {{ic|/etc/bash.bashrc}} と {{ic|~/.bashrc}} を読み込んで実行します。一方、インタラクティブな''ログイン''シェルは、これらに加えて {{ic|/etc/profile}} と {{ic|~/.bash_profile}} も読み込んで実行します。
{{ic|-c}} オプションや何もオプションを付けずに実行された場合の Bash は'''インタラクティブシェル'''です。標準入力やエラーはターミナルに接続されます。
 
   
  +
{{Note|Arch Linux では、{{ic|/bin/sh}} (かつては Bourne シェル実行ファイルでした) は {{ic|/bin/bash}} へのシンボリックリンクとなっています。Bash が {{ic|sh}} という名前で実行された場合、過去のバージョンの {{ic|sh}} の起動時の動作を模倣しようとします (POSIX 互換性も含む)。}}
=== レガシーモード ===
 
   
  +
=== 設定ファイル ===
Arch では {{ic|/bin/sh}} (Bourne shell の実行ファイルとして使用されていました) は {{ic|/bin/bash}} にシンボリックリンクされています。Bash が {{ic|sh}} という名前で起動された場合、POSIX 互換の伝統的な {{ic|sh}} の始動時の挙動を模倣します。
 
   
  +
Bash は一連のスタートアップファイルを実行しようと試みます。読み込まれるファイルは、Bash がどのように実行されたかに依存します。完全な説明は、GNU Bash マニュアルの [https://www.gnu.org/software/bash/manual/bash.html#Bash-Startup-Files Bash Startup Files] 章を参照してください。
レガシーモードで実行されたログインシェルは {{ic|/etc/profile}}、そして {{ic|~/.profile}} を読み込みます。
 
 
=== 設定ファイル ===
 
   
 
{| class="wikitable"
 
{| class="wikitable"
 
! ファイル
 
! ファイル
  +
! 説明
! ファイルのコマンドが読み込まれて実行 (''source'') される時
 
  +
! ログインシェル <sup>(以下のノートを参照)</sup>
  +
! インタラクティブ (''非ログイン''シェル)
 
|-
 
|-
 
| {{ic|/etc/profile}}
 
| {{ic|/etc/profile}}
| ''ログイン''シェルでもある''インタラクティブ''シェル (例えば、{{ic|/usr/bin/login}})。{{ic|/etc/profile.d/*.sh}} {{ic|/etc/bash.bashrc}} に記述されたアプリケーションの設定を読み込みます。
+
| {{ic|/etc/profile.d/*.sh}} {{ic|/etc/bash.bashrc}} アプリケーションの設定を [[source]] します。
  +
| {{Yes}}
|-
 
| {{ic|/etc/bash.bashrc}}
+
| {{No}}
| インタラクティブシェル (例えば、[[ターミナルエミュレータ]])。{{ic|1=-DSYS_BASHRC="/etc/bash.bashrc"}} コンパイルフラグに依存します。{{ic|/usr/share/bash-completion/bash_completion}} を読み込みます。
 
 
|-
 
|-
 
| {{ic|~/.bash_profile}}
 
| {{ic|~/.bash_profile}}
| ログンシェルでもあるインタラクティブシェル。{{ic|/etc/profile}} のユーザー別で読み込まれます。ファイルが存在しない場合{{ic|~/.bash_login}} と {{ic|~/.profile}} がこの順番でチェックされます。スケルトンファイル {{ic|/etc/skel/.bash_profile}} は {{ic|~/.bashrc}} も読み込みます。
+
| ユーザ毎の設定ファイルで。{{ic|/etc/profile}} のあとに読み込まれます。このファイルが存在しない場合{{ic|~/.bash_login}} と {{ic|~/.profile}} がこの順番でチェックされます。スケルトンファイル {{ic|/etc/skel/.bash_profile}} は {{ic|~/.bashrc}} も読み込みます。
  +
| {{Yes}}
|-
 
| {{ic|~/.bashrc}}
+
| {{No}}
| インタラクティブシェル。{{ic|/etc/bash.bashrc}} の後にユーザー別で読み込まれます。
 
 
|-
 
|-
 
| {{ic|~/.bash_logout}}
 
| {{ic|~/.bash_logout}}
| ログインシェルが終了した後
+
| ユーザ毎の設定ファイル。ログインシェルが終了する際に実行されます
  +
| {{Yes}}
  +
| {{No}}
  +
|-
  +
| {{ic|/etc/bash.bash_logout}}
  +
| このファイルが読み込まれるかどうかは、{{ic|1=-DSYS_BASH_LOGOUT="/etc/bash.bash_logout"}} コンパイルフラグに依存します。ログインシェルの終了時に実行されます。
  +
| {{Yes}}
  +
| {{No}}
  +
|-
  +
| {{ic|/etc/bash.bashrc}}
  +
| このファイルが読み込まれるかどうかは、{{ic|1=-DSYS_BASHRC="/etc/bash.bashrc"}} コンパイルフラグに依存します。このファイルは {{ic|/usr/share/bash-completion/bash_completion}} を読み込みます。
  +
| {{No}}
  +
| {{Yes}}
  +
|-
  +
| {{ic|~/.bashrc}}
  +
| ユーザ毎の設定ファイル。{{ic|/etc/bash.bashrc}} の後に読み込まれます。
  +
| {{No}}
  +
| {{Yes}}
 
|}
 
|}
   
  +
{{Note|
手短に言えば、全てのインタラクティブシェルは {{ic|/etc/bash.bashrc}} と {{ic|~/.bashrc}} を読み込み、インタラクティブな''ログイン''シェルはそれに加えて {{ic|/etc/profile}} と {{ic|~/.bash_profile}} も読み込みます。
 
  +
* ログインシェルは、{{ic|--login}} 引数付きで呼び出された場合に非インタラクティブになり得ます。
 
{{Note|インタラクティブだが、ログインシェルでない場合 {{ic|~/.bash_profile}} ''読み込まれません''が、親プロセス (ログインシェルでり得る) の環境は承継されます。詳しく[http://mywiki.wooledge.org/ProcessManagement#On_processes.2C_environments_and_inheritance] を参照。}}
+
* インタラクティブな''非ログイン''シェルは{{ic|~/.bash_profile}} を'''読み込ません'''。ですが、依然として親プロセスの環境変数を継承します (親プロセスがログインシェルであっても)。詳https://mywiki.wooledge.org/ProcessManagement#On_processes.2C_environments_and_inheritance を参照してください
  +
}}
 
順序の完全な説明は {{ic|man 1 bash}} や [http://www.gnu.org/software/bash/manual/bash.html#Bash-Startup-Files] の ''INVOCATION'' セクションを見て下さい。
 
   
 
=== シェルと環境変数 ===
 
=== シェルと環境変数 ===
   
Bash Bash によって実行されプログラムの動は様々な環境変数によって左右されます。[[環境変数]]を使うことでコマンドの検索ディレクトリや使用するブラウザなど有用な値を保存することができます。新しいシェルやスクリプトが起動されると親の変数継承され、シェル変数の内部セット使てスタートします [http://www.kingcomputerservices.com/unix_101/understanding_unix_shells_and_environment_variables.htm]。
+
Bash、及び Bash によって実行されプログラムの動様々な環境変数による影響を受ける可能性があります。[[環境変数]]は、コマンドが探されるディレクトリのリスト、どのブラウザを使用するかなど有用な値を保存するために使用されます。新しいシェルやスクリプトが実行された際、そのプロセスはプロセスの変数継承します。つまり内部のシェル変数をた状態で起動されるわけです [http://www.kingcomputerservices.com/unix_101/understanding_unix_shells_and_environment_variables.htm]。
   
Bash のシェル変数環境変数するためエクスポートすること可能です:
+
Bash のシェル変数環境変数するには、export する必要あります:
   
 
VARIABLE=content
 
VARIABLE=content
 
export VARIABLE
 
export VARIABLE
   
もしくはショートカットを使って:
+
これ、以下のようにショートカットすることも可能です:
   
 
export VARIABLE=content
 
export VARIABLE=content
   
環境変数は {{ic|~/.profile}} や {{ic|/etc/profile}} に記述するのがしきたり、全ての bourne 互換シェルはこらのファイルを使用します。
+
伝統的に環境変数は、他の Bourne 互換のシェルも使用できるようにするために、{{ic|~/.profile}} や {{ic|/etc/profile}} 定義されます。
   
詳しくは[[環境変数]]を参照してください。
+
より一般的な情報 [[環境変数]] を参照してください。
   
 
== コマンドライン ==
 
== コマンドライン ==
   
Bash のコマンドラインは [[Readline]] という名前の別のライブラリによって処理されています。Readline はコマンドラインを使用するための多数のショートカットがあります。単語ごとに前後に移動、単語の削除など。また、入力したコマンドの[[Readline#履歴|履歴]]を管理するのも Readline の仕事です。最後に、また重要なことですが、Readline は[[Readline#マクロ|マクロ]]作成するのを可能にします。
+
Bash のコマンドラインは [[Readline]] という名前の別のライブラリによって処理されています。Readline はコマンドラインと対話 (つまり、単語単位で前後に移動したり、単語削除したりなど) するための [[emacs]] や [[vi]] スタイルのショートカットを提供しています。また、入力したコマンドの[[Readline#履歴|履歴]]を管理するのも Readline の仕事です。最後に、また重要なことですが、Readline は[[Readline#マクロ|マクロ]]作成可能にします。
   
 
=== タブ補完 ===
 
=== タブ補完 ===
   
[[Wikipedia:Command-line_completion|タブ補完]]は {{ic|Tab}} を二回押すことによって途中まで入力したコマンドを自動補完するオプションです (デフォルトで有効)。
+
[[Wikipedia:Command-line_completion|タブ補完]]{{ic|Tab}} を押すことによって入力済みのコマンドを自動補完するオプションです (デフォルトで有効)。
   
==== シングルタブ機能 ====
+
==== シングルタブ ====
   
  +
コマンドの補完候補を全て表示するにはタブを最大で3回押す必要があります。タブを押す回数を減らしたい場合は、[[Readline#高速な補完]] を参照してください。
複数の補完候補があるときに {{ic|Tab}} を一回押して表示するようにするには:
 
   
  +
==== よく使われるプログラムとオプション ====
{{hc|~/.inputrc|
 
set show-all-if-ambiguous on
 
}}
 
   
  +
デフォルトでは、Bash によってタブ補完されるのはコマンド、ファイル名、そして変数のみです。{{Pkg|bash-completion}} をインストールすると、よく使われるコマンドとオプションに対するタブ補完も追加されます。この補完は、{{ic|/usr/share/bash-completion/bash_completion}} を [[source]] することで有効化することができます (このファイルは Arch Linux の {{ic|/etc/bash.bashrc}} で既に source されています)。{{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] を参照)。
また、補完ができないときに候補を表示するには:
 
   
  +
==== コマンド毎にカスタマイズする ====
{{hc|~/.inputrc|
 
set show-all-if-unmodified on
 
}}
 
   
  +
{{Note|{{ic|complete}} 組み込みコマンドを使用すると、{{Pkg|bash-completion}} と競合する場合があります。}}
==== プログラムとオプションを追加 ====
 
   
  +
デフォルトでは、Bash はコマンドの後のファイル名しかタブ補完しません。{{ic|complete -c}} を使うことで、コマンド名も補完できるようにできます:
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}} はあまり役に立たないかもしれません。
 
   
  +
{{hc|~/.bashrc|complete -c man which}}
==== プログラムとオプションを手動で追加 ====
 
   
  +
また、{{ic|-cf}} でコマンド名とファイル名を補完できます:
{{ic|complete -cf your_command}} という形式の行を使って基本的な補完ができます ({{Pkg|bash-completion}} の設定と衝突します):
 
   
  +
complete -cf sudo
{{hc|~/.bashrc|
 
complete -cf sudo
 
complete -cf man
 
}}
 
   
  +
その他の補完オプションは {{man|1|bash|Programmable Completion}} を見てください。
=== 履歴補完 ===
 
   
  +
=== 履歴 ===
履歴補完は矢印キー (下と上) で使います (参照: [[Readline#履歴]] と [https://www.gnu.org/software/bash/manual/html_node/Readline-Init-File-Syntax.html Readline Init File Syntax]):
 
  +
  +
==== 履歴による補完 ====
  +
  +
上下キーを Bash 履歴の検索に割り当てることができます ([[Readline#履歴]] と [https://www.gnu.org/software/bash/manual/html_node/Readline-Init-File-Syntax.html Readline Init File Syntax] を参照):
   
 
{{hc|~/.bashrc|
 
{{hc|~/.bashrc|
bind '"\e[A": history-search-backward'
+
bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-forward'
+
bind '"\e[B": history-search-forward'
 
}}
 
}}
   
  +
あるいは、全ての readline プログラムに適用するには:
or:
 
   
 
{{hc|~/.inputrc|
 
{{hc|~/.inputrc|
126行目: 140行目:
 
}}
 
}}
   
  +
==== 履歴のカスタマイズ ====
=== Ctrl による高速な単語移動 ===
 
   
Bash では {{ic|Ctrl+Left}} と {{ic|Ctrl+Right}} を使って単語ごと素早く移動できるようにすることができます。
+
{{ic|HISTCONTROL}} 変数により、特定のコマンド履歴残さないようにできます。
   
  +
連続する同じコマンドを記録しない:
{{hc|~/.inputrc|
 
  +
{{hc|~/.bashrc|2=export HISTCONTROL=ignoredups}}
"\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 機能 ===
 
  +
{{hc|~/.bashrc|2=export HISTCONTROL=erasedups}}
   
  +
空白で始まるコマンドは記録しない:
Zsh では {{ic|Alt+h}} を押すことで入力したコマンドのマニュアルを呼び出すことができます。同じことは Bash でも以下の行を {{ic|inputrc}} ファイルに追加することで可能です:
 
  +
{{hc|~/.bashrc|2=export HISTCONTROL=ignorespace}}
{{hc|/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"
 
}}
 
   
  +
連続する同じコマンド、及び空白で始まるコマンドは記録しない:
== エイリアス ==
 
  +
{{hc|~/.bashrc|2=export HISTCONTROL=ignoreboth}}
   
  +
同じコマンドは、一番最後を除いて記録せず、さらに空白で始まるコマンドも記録しない:
[[Wikipedia:Alias_(command)|alias]] は特定の単語を別の文字列で置き換えるコマンドです。システムコマンドを短縮したり、日頃使っているコマンドにデフォルトの引数を追加するのに使用します。
 
  +
{{hc|~/.bashrc|2=export HISTCONTROL="erasedups:ignorespace"}}
   
  +
詳細は {{man|1|bash|HISTCONTROL}} を参照してください。
個人的なエイリアスはなるべく {{ic|~/.bashrc}} に保存し、システム全体の (全てのユーザーに影響を与える) エイリアスは {{ic|/etc/bash.bashrc}} に記述します。エイリアスの例は [https://gist.github.com/anonymous/a9055e30f97bd19645c2] や [[Pacman ヒント#ショートカット]] を見て下さい。
 
   
  +
==== 履歴を無効にする ====
関数については、[[Bash/関数]]を参照。
 
   
  +
一時的に Bash の履歴を無効化するには:
== Tips and tricks ==
 
   
  +
$ set +o history
=== プロンプトのカスタマイズ ===
 
   
  +
以降、入力されたコマンドは {{ic|$HISTFILE}} に記録されません。
Bash のプロンプトは {{ic|$PS1}} 変数で変わります。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)
 
   
  +
これで、機密情報をディスクに残すことなく、{{ic|printf ''シークレット'' {{!}} sha256sum}} でパスワードのハッシュ値を計算したり、{{ic|gpg -eaF secret-pubkey.asc}} などの GPG の使用履歴を隠蔽したりできるようになります。
PS1='\[$red\]\u\[$reset\] \[$blue\]\w\[$reset\] \[$red\]\$ \[$reset\]\[$green\] '
 
  +
  +
履歴を有効化するには:
  +
  +
$ set -o history
  +
  +
全ての Bash 履歴を無効化するには:
  +
  +
{{hc|~/.bashrc or /etc/profile|2=
  +
export HISTSIZE=0
 
}}
 
}}
上の {{ic|$PS1}} は赤色の記号と緑色のコンソールテキストの root の Bash プロンプトで有用です。詳しくは、次を参照: [[Bash カラープロンプト]]。
 
   
  +
...そして、念のため、古い履歴ファイルを完全に削除してください:
==== タイトルのカスタマイズ ====
 
   
  +
$ wipe -i -l2 -x4 -p4 "$HISTFILE"
{{ic|$PROMPT_COMMAND}} 変数を使うことでプロンプトの前にコマンドを実行することができます。例えば、タイトルを現在のカレントディレクトリに変更:
 
  +
$ ln -sv /dev/null "$HISTFILE"
   
  +
=== Zsh の run-help 機能を模倣する ===
{{hc|~/.bashrc|<nowiki>
 
  +
export PROMPT_COMMAND='echo -ne "\033]0;$PWD\007"'
 
  +
[[Zsh]] では {{ic|Alt+h}} を押すことで、入力したコマンドのマニュアルを呼び出すことができます。[[Readline]] の bind を使うことで Bash でも同じようにできます:
</nowiki>}}
 
   
以下の設定はタイトルを最後に実行したコマンドに変更します、history ファイルが常に最新か確認してください:
 
 
{{hc|~/.bashrc|<nowiki>
 
{{hc|~/.bashrc|<nowiki>
  +
run-help() { help "$READLINE_LINE" 2>/dev/null || man "$READLINE_LINE"; }
export HISTCONTROL=ignoreboth
 
  +
bind -m vi-insert -x '"\eh": run-help'
export HISTIGNORE='history*'
 
  +
bind -m emacs -x '"\eh": run-help'
export PROMPT_COMMAND='history -a;echo -en "\e]2;";history 1|sed "s/^[ \t]*[0-9]\{1,\} //g";echo -en "\e\\";'
 
 
</nowiki>}}
 
</nowiki>}}
  +
  +
上記では、(デフォルトの) Emacs [[Readline#編集モード|編集モード]]を使用していることを前提としています。
  +
  +
== エイリアス ==
  +
  +
[[Wikipedia:ja:alias (コマンド)|alias]] は、ある単語の別名を定義するコマンドです。システムコマンドを短縮したり、日頃使っているコマンドにデフォルトの引数を追加したりするために使用されます。
  +
  +
ユーザ毎のエイリアスは、{{ic|~/.bashrc}} に定義するか、別のファイルに記述して {{ic|~/.bashrc}} からそのファイルを [[source]] することができます。システム全体で使用される (つまり、全てのユーザに適用される) エイリアスは {{ic|/etc/bash.bashrc}} に記述します。エイリアスの例は [https://gist.github.com/anonymous/a9055e30f97bd19645c2] を見てください。
  +
  +
関数については、[[Bash/関数]] を参照してください。
  +
  +
== ヒントとテクニック ==
  +
  +
=== プロンプトのカスタマイズ ===
  +
  +
[[Bash/プロンプトのカスタマイズ]] を見てください。
  +
  +
=== シンタックスハイライトとオートサジェスト機能 ===
  +
  +
{{AUR|blesh-git}} は、純粋な Bash で記述されたコマンドラインエディタであり、Readline の置き換えです。シンタックスハイライト、オートサジェスト、メニュー補完、略語、[[Vim]] 編集モード、フック関数など、多くの強化された機能を備えています。
  +
  +
インストール後、対話型セッションで設定ファイルを [[source]] してください。設定は [https://github.com/akinomyoga/ble.sh#14-user-settings-blerc ~/.blerc] ファイルと [https://github.com/akinomyoga/ble.sh/wiki wiki] で詳しく説明されています。安定版の {{AUR|blesh}} パッケージも利用可能です。
  +
  +
=== Command not found ===
  +
  +
[[pkgfile]] には "command not found" フックが含まれており、認識できないコマンドが入力されると自動的に公式リポジトリを検索します。
  +
  +
このフックを有効化するには、[[source]] する必要があります。例:
  +
  +
{{hc|~/.bashrc|
  +
source /usr/share/doc/pkgfile/command-not-found.bash}}
  +
  +
以降、利用できないコマンドを実行しようとすると、次のような情報が表示されるようになります:
  +
  +
{{hc|$ abiword|
  +
abiword may be found in the following packages:
  +
extra/abiword 3.0.1-2 /usr/bin/abiword
  +
}}
  +
  +
{{Note|このフックを動作させるには pkgfile のデータベースを更新する必要があるかもしれません。詳しくは [[pkgfile#インストール]] を参照してください。}}
   
 
=== ターミナルで Ctrl+z を無効化 ===
 
=== ターミナルで Ctrl+z を無効化 ===
   
コマンドを以下のようにすることで {{ic|Ctrl+z}} 機能 (アプリケーションの停止/終了) を無効化できます:
+
以下のようにコマンドをラップすることで{{ic|Ctrl+z}} 機能 (アプリケーションの停止/終了) を無効化することができます:
   
 
#!/bin/bash
 
#!/bin/bash
194行目: 244行目:
 
''adom''
 
''adom''
   
これで {{AUR|adom}} で {{ic|Shift+z}} の代わりに間違って {{ic|Ctrl+z}} を押してしまっても {{ic|Ctrl+z}} は無視されるため何も起こりません。
+
これで{{AUR|adom}} で {{ic|Shift+z}} ではなく {{ic|Ctrl+z}} を間違って押しても{{ic|Ctrl+z}} は無視されるため何も起こりません。
   
 
=== ログアウト後に画面をクリア ===
 
=== ログアウト後に画面をクリア ===
   
仮想ミナルでログアウト後に画面を消去するには:
+
仮想コンソールでログアウト後に画面を消去するには:
  +
 
{{hc|~/.bash_logout|
 
{{hc|~/.bash_logout|
 
clear
 
clear
 
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: ディレクトリです
 
}}
 
}}
   
しかし以下の設定をすると:
+
{{ic|.bashrc}} に以下の設定を追加すると:
  +
 
{{hc|~/.bashrc|
 
{{hc|~/.bashrc|
  +
...
 
shopt -s autocd
 
shopt -s autocd
  +
...
 
}}
 
}}
   
 
次の通り:
 
次の通り:
  +
[user@host ~] $ /etc
 
  +
[user@host ~]$ /etc
 
cd /etc
 
cd /etc
[user@host etc]
+
[user@host etc]$
  +
  +
=== Autojump ===
  +
  +
{{AUR|autojump-git}} は、ユーザがよく訪れるパスが記録されたデータベースを検索することでファイルシステムの移動を速くできる Python スクリプトです。
  +
  +
{{Pkg|zoxide}} はこれの代替品で、オリジナルの {{ic|autojump}} に比べてより多くの機能があり、パフォーマンスも優れているので、autojump の完全な代用として使うことができます。
  +
  +
=== ファイルの上書きを防止する ===
  +
  +
現在のセッション限定で、シェル出力のリダイレクトによる既存の通常ファイルへの上書きを禁止するには:
  +
  +
$ set -o noclobber
  +
  +
これは {{ic|set -C}} と同じです。
  +
  +
ユーザ毎にこの設定を永続化するには:
  +
  +
{{hc|~/.bashrc|output=...
  +
set -o noclobber
  +
}}
  +
  +
{{ic|noclobber}} が設定されている状態でファイルを手動で上書きするには:
  +
  +
$ echo "output" >| file.txt
  +
  +
=== ディレクトリスタックを使用して移動する ===
  +
  +
{{ic|pushd}} と {{ic|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 ~]
  +
  +
{{man|1|bash|DIRSTACK}} を参照してください。
   
 
== トラブルシューティング ==
 
== トラブルシューティング ==
237行目: 317行目:
 
=== ウィンドウをリサイズした時の行の折り返し ===
 
=== ウィンドウをリサイズした時の行の折り返し ===
   
[[ターミナルエミュレータ]]のウィンドウサイズを変更した時、Bash はリサイズシグナルを受け取ないことがあります。そうすると入力したテキストが正しく折り返されずにプロンプトをはみ出してしまいます。{{ic|checkwinsize}} シェルオプションはコマンドごとにウィンドウサイズの確認を行い、必要ならば、{{ic|LINES}} と {{ic|COLUMNS}} の値を更新します。
+
[[ターミナルエミュレータ]]のウィンドウサイズを変更した時、Bash はリサイズシグナルを受け取ないことがあります。そうすると入力したテキストが正しく折り返されずにプロンプトをはみ出してしまいます。{{ic|checkwinsize}} シェルオプションはコマンドごとにウィンドウサイズの確認を行い、必要ならば、{{ic|LINES}} と {{ic|COLUMNS}} の値を更新します。
   
 
{{hc|~/.bashrc|
 
{{hc|~/.bashrc|
245行目: 325行目:
 
=== ignoreeof が設定されているのにシェルが終了する ===
 
=== ignoreeof が設定されているのにシェルが終了する ===
   
{{ic|ignoreeof}} オプション設定したのに何度も {{ic|ctrl-d}} をすとシェルが終了するのは、このオプションこのキーバインド (正確には EOF 文字) を押しても10回まではシェルが終了しないようになっていためです。
+
{{ic|ignoreeof}} オプション設定されているのに{{ic|ctrl-d}} を繰り返し入力とシェルが終了してしまうのは、このオプションは {{ic|ctrl-d}} を連続10回押すと (厳密には連続する10個の EOF 文字が入力されると) シェルが終了するように設定すことが原因です。
  +
  +
この回数をより多くするには、IGNOREEOF 変数を設定してください。例:
   
回数を上げるには、IGNOREEOF 変数を設定してください。例:
 
 
export IGNOREEOF=100
 
export IGNOREEOF=100
  +
  +
=== スクリプトを解析してエラーをチェックする ===
  +
  +
{{Pkg|shellcheck}} パッケージは bash (及び他のシェル) のスクリプトを解析し、考えられるエラーを表示し、より良いコードを提案します。
  +
  +
また、このプログラムをベースにした同じ目的のウェブサイト [https://www.shellcheck.net shellcheck.net] も存在します。
   
 
== 参照 ==
 
== 参照 ==
   
  +
* [[Wikipedia:ja:Bash]]
* [https://www.gnu.org/software/bash/manual/bashref.html Bash Reference]
 
* [https://www.gnu.org/software/bash/manual/bash.html Bash manual page]
+
* [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/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''
+
* [https://www.aosabook.org/en/bash.html The Bourne-Again Shell] - ''The Architecture of Open Source Applications'' の第3章
  +
* [http://bashrcgenerator.com/ PS1 generator] - ドラッグアンドドロップのインターフェイスで .bashrc/PS1 Bash プロンプトを生成してくれます。
* [http://shellcheck.net Shellcheck] - Check bash scripts for common errors
 
  +
* [https://serverfault.com/questions/3743/what-useful-things-can-one-add-to-ones-bashrc その他の便利な .bashrc コマンド]
   
 
=== チュートリアル ===
 
=== チュートリアル ===
   
* [http://mywiki.wooledge.org/BashGuide BashGuide on Greg's Wiki]
+
* [https://mywiki.wooledge.org/ Greg's Wiki]
* [http://mywiki.wooledge.org/BashFAQ BashFAQ on Greg's Wiki]
+
* [https://mywiki.wooledge.org/BashGuide Greg's Wiki: BashGuide]
* [http://wiki.bash-hackers.org/doku.php Bash Hackers Wiki]
+
* [https://mywiki.wooledge.org/BashFAQ Greg's Wiki: BashFAQ]
  +
* [https://www.grymoire.com/Unix/Quote.html Quote Tutorial]
* [http://tldp.org/LDP/abs/html/ Advanced Bash Scripting Guide]
 
* [http://www.grymoire.com/Unix/Quote.html Quote Tutorial]
 
* [http://linuxtutorial.todolistme.net Introduction to Bash]
 
   
 
=== コミュニティ ===
 
=== コミュニティ ===
   
* [irc://irc.freenode.net#bash An active and friendly IRC channel for Bash]
+
* [ircs://irc.libera.chat/bash Bash のための アクティブでフレンドリーな IRC チャネル]
* [http://bashscripts.org Bashscripts.org]
 
   
 
=== サンプル ===
 
=== サンプル ===
   
* [http://tldp.org/HOWTO/Xterm-Title-4.html How to change the title of an xterm]
+
* [https://tldp.org/HOWTO/Xterm-Title-4.html How to change the title of an xterm]
  +
  +
{{TranslationStatus|Bash|2023-10-12|777140}}

2024年9月30日 (月) 05:04時点における最新版

関連記事

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 も読み込んで実行します。

ノート: Arch Linux では、/bin/sh (かつては Bourne シェル実行ファイルでした) は /bin/bash へのシンボリックリンクとなっています。Bash が sh という名前で実行された場合、過去のバージョンの sh の起動時の動作を模倣しようとします (POSIX 互換性も含む)。

設定ファイル

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
ノート:
  • ログインシェルは、--login 引数付きで呼び出された場合に非インタラクティブになり得ます。
  • インタラクティブな非ログインシェルは、~/.bash_profile読み込みません。ですが、依然として親プロセスの環境変数を継承します (親プロセスがログインシェルであっても)。詳細は https://mywiki.wooledge.org/ProcessManagement#On_processes.2C_environments_and_inheritance を参照してください。

シェルと環境変数

Bash、及び Bash によって実行されるプログラムの動作は、様々な環境変数による影響を受ける可能性があります。環境変数は、コマンドが探索されるディレクトリのリストや、どのブラウザを使用するかなど、有用な値を保存するために使用されます。新しいシェルやスクリプトが実行された際、そのプロセスは親プロセスの変数を継承します。つまり、内部のシェル変数を持った状態で起動されるわけです [1]

Bash 内のシェル変数を環境変数とするには、export する必要があります:

VARIABLE=content
export VARIABLE

これは、以下のようにショートカットすることも可能です:

export VARIABLE=content

伝統的に環境変数は、他の Bourne 互換のシェルも使用できるようにするために、~/.profile/etc/profile 内で定義されます。

より一般的な情報は 環境変数 を参照してください。

コマンドライン

Bash のコマンドラインは Readline という名前の別のライブラリによって処理されています。Readline は、コマンドラインと対話 (つまり、単語単位で前後に移動したり、単語を削除したりなど) するための emacsvi スタイルのショートカットを提供しています。また、入力したコマンドの履歴を管理するのも Readline の仕事です。最後に、また重要なことですが、Readline はマクロの作成も可能にします。

タブ補完

タブ補完とは、Tab を押すことによって入力済みのコマンドを自動補完するオプションです (デフォルトで有効)。

シングルタブ

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

よく使われるプログラムとオプション

デフォルトでは、Bash によってタブ補完されるのはコマンド、ファイル名、そして変数のみです。bash-completion をインストールすると、よく使われるコマンドとオプションに対するタブ補完も追加されます。この補完は、/usr/share/bash-completion/bash_completionsource することで有効化することができます (このファイルは Arch Linux の /etc/bash.bashrc で既に source されています)。bash-completion を使うと、($ ls file.*<tab><tab> などの) 通常の補完も挙動が変化しますが、$ compopt -o bashdefault program によって元に戻すことができます (詳しくは [2][3] を参照)。

コマンド毎にカスタマイズする

ノート: complete 組み込みコマンドを使用すると、bash-completion と競合する場合があります。

デフォルトでは、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
ノート: このフックを動作させるには pkgfile のデータベースを更新する必要があるかもしれません。詳しくは pkgfile#インストール を参照してください。

ターミナルで 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: ディレクトリです

.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

ディレクトリスタックを使用して移動する

pushdpopd を使用すると、ディレクトリに切り替えるときにスタックにディレクトリをプッシュまたはポップできます。これは、ナビゲーション履歴を リプレイ するのに役立ちます。

[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 を参照してください。

トラブルシューティング

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

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

~/.bashrc
shopt -s checkwinsize

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

ignoreeof オプションが設定されているのに、ctrl-d を繰り返し入力するとシェルが終了してしまうのは、このオプションは ctrl-d を連続10回押すと (厳密には連続する10個の EOF 文字が入力されると) シェルが終了するように設定することが原因です。

この回数をより多くするには、IGNOREEOF 変数を設定してください。例:

export IGNOREEOF=100

スクリプトを解析してエラーをチェックする

shellcheck パッケージは bash (及び他のシェル) のスクリプトを解析し、考えられるエラーを表示し、より良いコードを提案します。

また、このプログラムをベースにした同じ目的のウェブサイト shellcheck.net も存在します。

参照

チュートリアル

コミュニティ

サンプル

翻訳ステータス: このページは en:Bash の翻訳バージョンです。最後の翻訳日は 2023-10-12 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。