「Bash」の版間の差分
(→ヒントとテクニック: 同期) |
|||
(7人の利用者による、間の44版が非表示) | |||
1行目: | 1行目: | ||
− | [[Category:コマンドシェル]] |
+ | [[Category:コマンドラインシェル]] |
+ | [[Category:GNU]] |
||
[[de:Bash]] |
[[de:Bash]] |
||
[[en:Bash]] |
[[en:Bash]] |
||
− | [[es: |
+ | [[es:Bash]] |
− | [[it:Bash]] |
||
− | [[nl:Bashrc]] |
||
[[ru:Bash]] |
[[ru:Bash]] |
||
− | [[zh- |
+ | [[zh-hans:Bash]] |
− | {{Related articles start |
+ | {{Related articles start}} |
− | {{ |
+ | {{Related|Bash/関数}} |
+ | {{Related|Bash/プロンプトのカスタマイズ}} |
||
− | {{Related3|Environment variables|環境変数}} |
||
+ | {{Related|環境変数}} |
||
− | {{Related4|Readline}} |
||
− | {{Related| |
+ | {{Related|Readline}} |
− | {{ |
+ | {{Related|Fortune}} |
− | {{Related|Pkgfile |
+ | {{Related|Pkgfile}} |
+ | {{Related|コマンドラインシェル}} |
||
{{Related articles end}} |
{{Related articles end}} |
||
− | + | [https://www.gnu.org/software/bash/ Bash] (Bourne-again Shell) は [[GNU プロジェクト]]による[[コマンドラインシェル]]/プログラミング言語です。Bash という名前は、長い間非推奨であった Bourne shell という先祖の名前のオマージュから来ています。Bash は GNU/Linux を含むほとんどの UNIX ライクなオペレーティングシステムで動作します。 |
|
+ | |||
+ | Bash は、Arch Linux のデフォルトのコマンドラインシェルです。 |
||
== 実行 == |
== 実行 == |
||
− | Bash |
+ | Bash は、起動の仕方によって動作が変わります。以下、一部のモードについて説明します。 |
− | + | 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|/etc/profile.d/*.sh}} と {{ic|/etc/bash.bashrc}} のアプリケーションの設定を [[source]] します。 |
+ | | {{Yes}} |
||
− | |- |
||
− | | {{ |
+ | | {{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}} も読み込みます。 |
+ | | {{Yes}} |
||
− | |- |
||
− | | {{ |
+ | | {{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}} 引数付きで呼び出された場合に非インタラクティブになり得ます。 |
||
− | |||
− | + | * インタラクティブな''非ログイン''シェルは、{{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、及び 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 互換のシェルも使用できるようにするために、{{ic|~/.profile}} や {{ic|/etc/profile}} 内で定義されます。 |
− | + | より一般的な情報は [[環境変数]] を参照してください。 |
|
== コマンドライン == |
== コマンドライン == |
||
− | Bash のコマンドラインは [[Readline]] という名前の別のライブラリによって処理されています。Readline |
+ | Bash のコマンドラインは [[Readline]] という名前の別のライブラリによって処理されています。Readline は、コマンドラインと対話 (つまり、単語単位で前後に移動したり、単語を削除したりなど) するための [[emacs]] や [[vi]] スタイルのショートカットを提供しています。また、入力したコマンドの[[Readline#履歴|履歴]]を管理するのも Readline の仕事です。最後に、また重要なことですが、Readline は[[Readline#マクロ|マクロ]]の作成も可能にします。 |
=== タブ補完 === |
=== タブ補完 === |
||
− | [[Wikipedia:Command-line_completion|タブ補完]]は |
+ | [[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#History]] と [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[B": history-search-forward' |
|
}} |
}} |
||
+ | あるいは、全ての readline プログラムに適用するには: |
||
− | or: |
||
{{hc|~/.inputrc| |
{{hc|~/.inputrc| |
||
127行目: | 140行目: | ||
}} |
}} |
||
+ | ==== 履歴のカスタマイズ ==== |
||
− | === Ctrl による高速な単語移動 === |
||
− | + | {{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 Tips (日本語)#ショートカット]] を見て下さい。 |
||
+ | ==== 履歴を無効にする ==== |
||
− | 関数については、[[Bash/Functions]] を参照。 |
||
+ | 一時的に 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 プロンプトで有用です。詳しくは、次を参照: [[Color Bash Prompt (日本語)|Color Bash Prompt]]。 |
||
+ | ...そして、念のため、古い履歴ファイルを完全に削除してください: |
||
− | ==== タイトルのカスタマイズ ==== |
||
+ | $ 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}} 機能 (アプリケーションの停止/終了) を無効化することができます: |
|
#!/bin/bash |
#!/bin/bash |
||
195行目: | 244行目: | ||
''adom'' |
''adom'' |
||
− | これで |
+ | これで、{{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: |
+ | 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}} を参照してください。 |
||
== トラブルシューティング == |
== トラブルシューティング == |
||
238行目: | 317行目: | ||
=== ウィンドウをリサイズした時の行の折り返し === |
=== ウィンドウをリサイズした時の行の折り返し === |
||
− | [[ターミナルエミュレータ]]のウィンドウサイズを変更した時、Bash はリサイズシグナルを受け取 |
+ | [[ターミナルエミュレータ]]のウィンドウサイズを変更した時、Bash はリサイズシグナルを受け取らないことがあります。そうすると入力したテキストが正しく折り返されずにプロンプトをはみ出してしまいます。{{ic|checkwinsize}} シェルオプションはコマンドごとにウィンドウサイズの確認を行い、必要ならば、{{ic|LINES}} と {{ic|COLUMNS}} の値を更新します。 |
{{hc|~/.bashrc| |
{{hc|~/.bashrc| |
||
shopt -s checkwinsize |
shopt -s checkwinsize |
||
}} |
}} |
||
+ | |||
+ | === ignoreeof が設定されているのにシェルが終了する === |
||
+ | |||
+ | {{ic|ignoreeof}} オプションが設定されているのに、{{ic|ctrl-d}} を繰り返し入力するとシェルが終了してしまうのは、このオプションは {{ic|ctrl-d}} を連続10回押すと (厳密には連続する10個の EOF 文字が入力されると) シェルが終了するように設定することが原因です。 |
||
+ | |||
+ | この回数をより多くするには、IGNOREEOF 変数を設定してください。例: |
||
+ | |||
+ | 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/ |
+ | * [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] |
||
− | * [ |
+ | * [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 コマンド] |
||
=== チュートリアル === |
=== チュートリアル === |
||
− | * [ |
+ | * [https://mywiki.wooledge.org/ Greg's Wiki] |
− | * [ |
+ | * [https://mywiki.wooledge.org/BashGuide Greg's Wiki: BashGuide] |
− | * [ |
+ | * [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.ibm.com/developerworks/linux/library/l-bash.html Bash Scripting by Example] |
||
− | * [http://www.grymoire.com/Unix/Quote.html Quote Tutorial] |
||
− | * [http://linuxtutorial.todolistme.net Introduction to Bash] |
||
=== コミュニティ === |
=== コミュニティ === |
||
− | * [ |
+ | * [ircs://irc.libera.chat/bash Bash のための アクティブでフレンドリーな IRC チャネル] |
− | * [http://bashscripts.org Bashscripts.org] |
||
=== サンプル === |
=== サンプル === |
||
− | * [ |
+ | * [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
も読み込んで実行します。
設定ファイル
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 |
シェルと環境変数
Bash、及び Bash によって実行されるプログラムの動作は、様々な環境変数による影響を受ける可能性があります。環境変数は、コマンドが探索されるディレクトリのリストや、どのブラウザを使用するかなど、有用な値を保存するために使用されます。新しいシェルやスクリプトが実行された際、そのプロセスは親プロセスの変数を継承します。つまり、内部のシェル変数を持った状態で起動されるわけです [1]。
Bash 内のシェル変数を環境変数とするには、export する必要があります:
VARIABLE=content export VARIABLE
これは、以下のようにショートカットすることも可能です:
export VARIABLE=content
伝統的に環境変数は、他の Bourne 互換のシェルも使用できるようにするために、~/.profile
や /etc/profile
内で定義されます。
より一般的な情報は 環境変数 を参照してください。
コマンドライン
Bash のコマンドラインは Readline という名前の別のライブラリによって処理されています。Readline は、コマンドラインと対話 (つまり、単語単位で前後に移動したり、単語を削除したりなど) するための emacs や vi スタイルのショートカットを提供しています。また、入力したコマンドの履歴を管理するのも Readline の仕事です。最後に、また重要なことですが、Readline はマクロの作成も可能にします。
タブ補完
タブ補完とは、Tab
を押すことによって入力済みのコマンドを自動補完するオプションです (デフォルトで有効)。
シングルタブ
コマンドの補完候補を全て表示するにはタブを最大で3回押す必要があります。タブを押す回数を減らしたい場合は、Readline#高速な補完 を参照してください。
よく使われるプログラムとオプション
デフォルトでは、Bash によってタブ補完されるのはコマンド、ファイル名、そして変数のみです。bash-completion をインストールすると、よく使われるコマンドとオプションに対するタブ補完も追加されます。この補完は、/usr/share/bash-completion/bash_completion
を source することで有効化することができます (このファイルは Arch Linux の /etc/bash.bashrc
で既に source されています)。bash-completion を使うと、($ ls file.*<tab><tab>
などの) 通常の補完も挙動が変化しますが、$ compopt -o bashdefault program
によって元に戻すことができます (詳しくは [2] と [3] を参照)。
コマンド毎にカスタマイズする
デフォルトでは、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
ターミナルで 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: ディレクトリです
.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
ディレクトリスタックを使用して移動する
pushd
と 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 ~]
bash(1) § DIRSTACK を参照してください。
トラブルシューティング
ウィンドウをリサイズした時の行の折り返し
ターミナルエミュレータのウィンドウサイズを変更した時、Bash はリサイズシグナルを受け取らないことがあります。そうすると入力したテキストが正しく折り返されずにプロンプトをはみ出してしまいます。checkwinsize
シェルオプションはコマンドごとにウィンドウサイズの確認を行い、必要ならば、LINES
と COLUMNS
の値を更新します。
~/.bashrc
shopt -s checkwinsize
ignoreeof が設定されているのにシェルが終了する
ignoreeof
オプションが設定されているのに、ctrl-d
を繰り返し入力するとシェルが終了してしまうのは、このオプションは ctrl-d
を連続10回押すと (厳密には連続する10個の EOF 文字が入力されると) シェルが終了するように設定することが原因です。
この回数をより多くするには、IGNOREEOF 変数を設定してください。例:
export IGNOREEOF=100
スクリプトを解析してエラーをチェックする
shellcheck パッケージは bash (及び他のシェル) のスクリプトを解析し、考えられるエラーを表示し、より良いコードを提案します。
また、このプログラムをベースにした同じ目的のウェブサイト shellcheck.net も存在します。
参照
- Wikipedia:ja:Bash
- Bash Reference Manual (あるいは
/usr/share/doc/bash/bashref.html
) - Readline Init File Syntax
- The Bourne-Again Shell - The Architecture of Open Source Applications の第3章
- PS1 generator - ドラッグアンドドロップのインターフェイスで .bashrc/PS1 Bash プロンプトを生成してくれます。
- その他の便利な .bashrc コマンド