コンテンツにスキップ

「Bash」の版間の差分

提供: ArchWiki
削除された内容 追加された内容
AshMyzk (トーク | 投稿記録)
参照: 修正
Kgx (トーク | 投稿記録)
 
(2人の利用者による、間の6版が非表示)
94行目: 94行目:
== コマンドライン ==
== コマンドライン ==


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#高速な補完]]を読んでください。
コマンドの補完候補を全て表示するにはタブを最大3回押す必要があります。タブを押す回数を減らしたい場合は[[Readline#高速な補完]] 参照してください。


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


デフォルトでは、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] を参照)。
デフォルトでは、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] を参照)。


==== コマンド毎にカスタマイズする ====
==== プログラムとオプションを手動で追加 ====


{{Note|{{ic|complete}} を使用すると {{Pkg|bash-completion}} と衝突する可能性があります。}}
{{Note|{{ic|complete}} 組み込みコマンドを使用すると{{Pkg|bash-completion}} と競合する場合があります。}}


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

{{hc|~/.bashrc|
complete -c man which
{{hc|~/.bashrc|complete -c man which}}

}}
もしくはコマンド名とファイル名を補完するには {{ic|-cf}} を使用:
また、{{ic|-cf}} でコマンド名とファイル名を補完できます:

{{bc|complete -cf sudo}}
complete -cf sudo
詳しくは Bash の 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 プログラム全てに適用するには:
あるいは、全ての readline プログラムに適用するには:


{{hc|~/.inputrc|
{{hc|~/.inputrc|
138行目: 140行目:
}}
}}


==== 履歴を短くする ====
==== 履歴のカスタマイズ ====


{{ic|HISTCONTROL}} 変数を使うことで履歴に特定のコマンドが記録ないようにできます。例えば、同じコマンドが重複して記録されないようにするには:
{{ic|HISTCONTROL}} 変数により、特定のコマンドを履歴に残さないようにできます。

連続する同じコマンドを記録しない:
{{hc|~/.bashrc|2=export HISTCONTROL=ignoredups}}
{{hc|~/.bashrc|2=export HISTCONTROL=ignoredups}}

{{ic|erasedups}} に設定すると (コマンドが実行された順番と関係なく) Bash の履歴に同じコマンドが含まれないようになります。詳しくは Bash の man ページを見てください。
同じコマンドは、一番最後を除いて記録しない:
{{hc|~/.bashrc|2=export HISTCONTROL=erasedups}}

空白で始まるコマンドは記録しない:
{{hc|~/.bashrc|2=export HISTCONTROL=ignorespace}}

連続する同じコマンド、及び空白で始まるコマンドは記録しない:
{{hc|~/.bashrc|2=export HISTCONTROL=ignoreboth}}

同じコマンドは、一番最後を除いて記録せず、さらに空白で始まるコマンドも記録しない:
{{hc|~/.bashrc|2=export HISTCONTROL="erasedups:ignorespace"}}

詳細は {{man|1|bash|HISTCONTROL}} を参照してください。


==== 履歴を無効にする ====
==== 履歴を無効にする ====


bash の履歴を一時的にだけ無効する場合。
一時的に Bash の履歴を無効するには:


$ set +o history
$ set +o history


現在、入力されたコマンドは {{ic|$HISTFILE}} に記録されません。
以降、入力されたコマンドは {{ic|$HISTFILE}} に記録されません。


例えば {{ic|printf secret {{!}} sha256sum}} でパスワードハッシュしたり、 {{ic|gpg -eaF secret-pubkey.asc}} GPG の使用を隠したりすることができるようになりました
これで、機密情報をディスクに残すことなく、{{ic|printf ''シークレット'' {{!}} sha256sum}} でパスワードハッシュ値を計算したり、{{ic|gpg -eaF secret-pubkey.asc}} などの GPG の使用履歴を隠したりできるようになりま
秘密はディスクに書き込まれません。


履歴を有効するには
履歴を有効するには:


$ set -o history
$ set -o history


全て Bash 履歴を無効するには:
{{Tip|{{ic|HISTCONTROL}} 変数に {{ic|ignorespace}} が含まれている場合、スペースで始まるコマンドは履歴ファイルに保存されません。詳しくは {{man|1|bash|Shell Variables}} を参照してください。}}

bash の履歴を全て無効するには


{{hc|~/.bashrc or /etc/profile|2=
{{hc|~/.bashrc or /etc/profile|2=
167行目: 181行目:
}}
}}


...そして、念のため、古いヒストファイルを破棄してください
...そして、念のため、古い履歴ファイルを完全に削除してください:


$ wipe -i -l2 -x4 -p4 "$HISTFILE"
$ wipe -i -l2 -x4 -p4 "$HISTFILE"
174行目: 188行目:
=== Zsh の run-help 機能を模倣する ===
=== Zsh の run-help 機能を模倣する ===


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

{{hc|~/.bashrc|<nowiki>
{{hc|~/.bashrc|<nowiki>
run-help() { help "$READLINE_LINE" 2>/dev/null || man "$READLINE_LINE"; }
run-help() { help "$READLINE_LINE" 2>/dev/null || man "$READLINE_LINE"; }
180行目: 195行目:
bind -m emacs -x '"\eh": run-help'
bind -m emacs -x '"\eh": run-help'
</nowiki>}}
</nowiki>}}

上記では (デフォルトの) Emacs [[Readline#編集モード|編集モード]] を使用していることを前提としています。
上記では(デフォルトの) Emacs [[Readline#編集モード|編集モード]]を使用していることを前提としています。


== エイリアス ==
== エイリアス ==


[[Wikipedia:Alias_(command)|alias]] は特定の単語を別文字列で置き換えるコマンドです。システムコマンドを短縮したり、日頃使っているコマンドにデフォルトの引数を追加するに使用ます。
[[Wikipedia:ja:alias (コマンド)|alias]] は、ある単語の別名を定義するコマンドです。システムコマンドを短縮したり、日頃使っているコマンドにデフォルトの引数を追加したりするために使用されます。


個人的なエイリアスはなるべく {{ic|~/.bashrc}} に保存し、システム全体 (全てのユーザ影響を与える) エイリアスは {{ic|/etc/bash.bashrc}} に記述します。エイリアスの例は [https://gist.github.com/anonymous/a9055e30f97bd19645c2] を見てください。
ユーザ毎のエイリアスは{{ic|~/.bashrc}} に定義するか別のファイルに記述して {{ic|~/.bashrc}} からそのファイルを [[source]] することができます。システム全体で使用される (つまり、全てのユーザに適用される) エイリアスは {{ic|/etc/bash.bashrc}} に記述します。エイリアスの例は [https://gist.github.com/anonymous/a9055e30f97bd19645c2] を見てください。


関数については、[[Bash/関数]]を参照。
関数については、[[Bash/関数]] を参照してください


== ヒントとテクニック ==
== ヒントとテクニック ==
194行目: 210行目:
=== プロンプトのカスタマイズ ===
=== プロンプトのカスタマイズ ===


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


=== シンタックスハイライトとオートサジェスト機能 ===
=== シンタックスハイライトとオートサジェスト機能 ===


[https://github.com/akinomyoga/ble.sh ble.sh] Readline を置き換える、純粋な Bash で書かれたコマンドラインエディタです。シンタックスハイライト、オートサジェスト、メニュー補完、略語、[[Vim]] 編集モード、フック関数など、多くの拡張機能を備えています。
{{AUR|blesh-git}} は、純粋な Bash で記述されたコマンドラインエディタであり、Readline の置き換えです。シンタックスハイライト、オートサジェスト、メニュー補完、略語、[[Vim]] 編集モード、フック関数など、多くの強化された機能を備えています。


インストール後、対話型セッションで [[ヘルプ:読み方#Source|Source]] を実行してください。設定は [https://github.com/akinomyoga/ble.sh#14-user-settings-blerc ~/.blerc] ファイルと [https://github.com/akinomyoga/ble.sh/wiki/%E7%9B%AE%E6%AC%A1 wiki] で詳しく説明されています。
インストール後、対話型セッションで設定ファイルを [[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 ===
=== Command not found ===


[[pkgfile]] には "command not found" フックが含まれており、認識できないコマンド入力ると自動的に公式リポジトリを検索します。
[[pkgfile]] には "command not found" フックが含まれており、認識できないコマンド入力されると自動的に公式リポジトリを検索します。


このフックを有効するには、例えば以下のように [[ヘルプ:読み方#source|source]] する必要があります。
このフックを有効するには、[[source]] する必要があります。例:


{{hc|~/.bashrc|
{{hc|~/.bashrc|
source /usr/share/doc/pkgfile/command-not-found.bash}}
source /usr/share/doc/pkgfile/command-not-found.bash}}


その後、利用できないコマンドを実行しようとすると、次のような情報が表示されます
以降、利用できないコマンドを実行しようとすると、次のような情報が表示されるようになります:


{{hc|$ abiword|
{{hc|$ abiword|
218行目: 234行目:
}}
}}


{{Note|動作させるpkgfileデータベースを更新する必要があるかもしれません。 詳しくは [[pkgfile#Installation]] を参照してください。}}
{{Note|このフックを動作させるにpkgfileデータベースを更新する必要があるかもしれません。詳しくは [[pkgfile#インストール]] を参照してください。}}

代替の "command not found" フックは {{AUR|command-not-found}} で提供されており、以下のようになります。

{{hc|$ abiword|
The command 'abiword' is provided by the following packages:
'''abiword''' (2.8.6-7) from extra
[ abiword ]
'''abiword''' (2.8.6-7) from staging
[ abiword ]
'''abiword''' (2.8.6-7) from testing
[ abiword ]
}}


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


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


#!/bin/bash
#!/bin/bash
240行目: 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
253行目: 258行目:


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

{{hc|$ /etc|
{{hc|$ /etc|
bash: /etc: Is a directory
bash: /etc: ディレクトリです
}}
}}


{{ic|.bashrc}} に以下の設定を追加すると:
{{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 ===
=== Autojump ===


{{AUR|autojump}} を使うことでユーザ頻繁に使用しているパスが記録されたデータベースを検索してファイルシステム移動できす。
{{AUR|autojump-git}} は、ユーザがよく訪れるパスが記録されたデータベースを検索することでファイルシステム移動を速くできる Python スクリプトです。


{{Pkg|zoxide}} はこれの代替品で、オリジナルの {{ic|autojump}} に比べてより多くの機能があり、パフォーマンスも優れているので、autojump の完全な代用として使うことができます。
パッケージをインストールしたら {{ic|/etc/profile.d/autojump.bash}} を [[ヘルプ:読み方#Source|Source]] することで使えるようになります。

代替品としては {{Pkg|zoxide}} があり、オリジナルの {{ic|autojump}} と比べて機能が追加され、性能も向上しています。


=== ファイルの上書きを防止する ===
=== ファイルの上書きを防止する ===


現在のセッションで、シェル出力のリダイレクトによって既存の通常ファイル上書きされないようにするためです。
現在のセッション限定で、シェル出力のリダイレクトによ既存の通常ファイルへの上書きを禁止するには:


$ set -o noclobber
$ set -o noclobber
283行目: 291行目:
これは {{ic|set -C}} と同じです。
これは {{ic|set -C}} と同じです。


変更をユーザために永続的にするためには
ユーザ毎にこ設定を永続するには:


{{hc|~/.bashrc|output=...
{{hc|~/.bashrc|output=...
set -o noclobber}}
set -o noclobber
}}


{{ic|noclobber}} 設定した状態で、手動でファイルを上書きする場合。
{{ic|noclobber}} 設定されている状態でファイルを手動で上書きするには:


$ echo "output" >| file.txt
$ echo "output" >| file.txt
294行目: 303行目:
=== ディレクトリスタックを使用して移動する ===
=== ディレクトリスタックを使用して移動する ===


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


[user@host ~] pushd /tmp/dir1
[user@host ~] pushd /tmp/dir1
308行目: 317行目:
=== ウィンドウをリサイズした時の行の折り返し ===
=== ウィンドウをリサイズした時の行の折り返し ===


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


{{hc|~/.bashrc|
{{hc|~/.bashrc|
316行目: 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 (および他のシェル) スクリプトを解析し、考えられるエラーを表示し、よりいコーディングを提案します。
{{Pkg|shellcheck}} パッケージは bash (び他のシェル) スクリプトを解析し、考えられるエラーを表示し、よりいコーを提案します。


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



== 参照 ==
== 参照 ==
351行目: 360行目:


* [https://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 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。