バッシュのカスタマイズ

オペレーティング システムの最も外側の層 (ユーザーが操作する部分) は、シェル. Fedora には、いくつかのシェルがプリインストールされています。 シェルは、グラフィカルまたはテキストベースのいずれかです。 ドキュメントでは、GUI (Graphical User Interface) と CLI (Command-Line Interface) の頭字語が、グラフィカルとテキストベースのシェル/インターフェイスを区別するために使用されることがよくあります。 その他の GUI とCLIシェルは使用できますが、ノームは Fedora のデフォルト GUI であり、 Bash はデフォルトの CLI です。

この記事の残りの部分では、Bash CLI で推奨されるドットファイル プラクティスについて説明します。

バッシュの概要

Bashリファレンスマニュアルから:

基本的に、シェルはコマンドを実行する単なるマクロ プロセッサです。 マクロ プロセッサという用語は、テキストとシンボルを展開してより大きな式を作成する機能を意味します。

Bash のリファレンス ドキュメント
Edition 5.0、Bash バージョン 5.0 用。
2019年5月

ユーザーが他のプログラムを起動して操作できるようにするだけでなく、Bash シェルにはいくつかの組み込みコマンドとキーワードも含まれています。 Bash の組み込み機能は、高級プログラミング言語それ自体で。 Bash のキーワードと演算子のいくつかは、C プログラミング言語.

Bash は、対話モードまたは非対話モードのいずれかで呼び出すことができます。 Bash のインタラクティブ モードは、ほとんどの人が使い慣れている典型的な端末/コマンド ライン インターフェイスです。GNOME ターミナルは、デフォルトで Bash をインタラクティブ モードで起動します。 Bash が非対話モードで実行される例は、コマンドとデータが配管されたファイルまたはシェルスクリプトからアクセスします。 Bash が動作できるその他の操作モードには、ログイン、非ログイン、リモート、POSIX、unix sh、制限付き、およびユーザーとは異なる UID/GID があります。 これらのモードのさまざまな組み合わせが可能です。 たとえば、対話型 + 制限付き + POSIX または非対話型 + 非ログイン + リモートなどです。 Bash が処理するスタートアップ ファイルは、起動時に要求されるモードの組み合わせによって異なります。 スタートアップ ファイルを変更する場合は、これらの動作モードを理解する必要があります。

Bashのリファレンスマニュアルによると、Bashは…

1. ファイルから入力を読み取ります...、-c 呼び出しオプションへの引数として指定された文字列から...、またはユーザーの端末から。

2. 引用規則に従って、入力を単語と演算子に分割します。 … これらのトークンはメタ文字で区切られています。 このステップで別名展開が行われます。

3. トークンを単純なコマンドと複合コマンドに解析します。

4. さまざまなシェル展開を実行し、展開されたトークンをファイル名のリストとコマンドと引数に分割します。

5. 必要なリダイレクトを実行し、リダイレクト演算子とそのオペランドを引数リストから削除します。

6. コマンドを実行します。

7. オプションで、コマンドが完了するまで待機し、その終了ステータスを収集します。

Bash のリファレンス ドキュメント
Edition 5.0、Bash バージョン 5.0 用。
2019年5月

ユーザーがターミナル エミュレーターを起動してコマンド ラインにアクセスすると、対話型のシェル セッションが開始されます。 デフォルトでは、GNOME ターミナルはユーザーのシェルを非ログインモードで起動します。 GNOME ターミナルがログイン モードまたは非ログイン モードのどちらでシェルを起動するかは、[編集] → [設定] → [プロファイル] → [コマンド] で設定できます。 起動時に –login フラグを Bash に渡すことで、ログイン モードを要求することもできます。 また、Bash のログイン モードと非対話モードは排他的ではないことに注意してください。 ログイン モードと非対話モードの両方で同時に Bash を実行することができます。

Bash の呼び出し

それが通過しない限り、noprofile フラグを指定すると、Bash ログイン シェルは特定の初期化ファイルにあるコマンドを読み取って実行します。 これらのファイルの最初は /etc/profile (存在する場合) であり、その後に ~/.bash_profile、~/.bash_login、または ~/.profile のいずれかが続きます。 という順番で検索しました。 ユーザーがログイン シェルを終了するとき、または非対話型ログイン シェルの場合にスクリプトが組み込みの exit を呼び出す場合、Bash は ~/.bash_logout にあるコマンドを読み取り、実行します。存在します。 ファイル /etc/profile は通常、/etc/bashrc をソースし、そこにあるコマンドを読み取って実行します。次に、/etc/profile.d を検索して、sh 拡張子を持つファイルを検索し、読み取って実行します。 同様に、ファイル ~/.bash_profile は通常、ファイル ~/.bashrc をソースします。 /etc/bashrc と ~/.bashrc の両方に、二重ソースを防ぐためのチェックがあります。

ログイン シェルではないインタラクティブ シェルは、最初に呼び出されたときに ~/.bashrc ファイルを読み込みます。 これは、Fedora でターミナルを開くときにユーザーが入力する通常のタイプのシェルです。 Bash が非対話モードで開始されると (シェル スクリプトの実行時と同様)、環境内で BASH_ENV 変数が検索されます。 見つかった場合は、値を展開し、展開された値をファイルの名前として使用して読み取り、実行します。 Bash は、次のコマンドが実行されたかのように動作します。

                if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
              

PATH 変数の値は、ファイル名の検索には使用されないことに注意してください。

ユーザー固有の重要なドットファイル

Bash の最も有名なユーザー ドットファイルは ~/.bashrc です。 ほとんどのユーザー カスタマイズは、このファイルを編集することによって行われます。 上記のすべてのファイルを変更する理由があるため、ほとんどのユーザーのカスタマイズは手間がかかる場合があります。 言及されていない他のファイルと同様に。 Bash の環境は、さまざまな好みを持つさまざまなユーザーのニーズに合わせて、高度にカスタマイズできるように設計されています。

Bash ログイン シェルが正常に終了すると、~/.bash_logout が呼び出され、次に /etc/bash_logout が存在する場合は呼び出されます。 次の図は、対話型シェルとして呼び出されたときに Bash がたどるプロセスを示すシーケンス図です。 たとえば、ユーザーがデスクトップ環境からターミナル エミュレータを開くと、次のシーケンスが実行されます。

さまざまな呼び出し方法で Bash がどのように動作するかを理解すると、最も関心のある典型的な呼び出し方法はわずかしかないことが明らかになります。 これらは、非対話型および対話型のログイン シェルと、非対話型および対話型の非ログイン シェルです。 グローバル環境のカスタマイズが必要な場合は、必要な設定を .sh 拡張子が付いた一意の名前のファイル (たとえば、custom.sh) に配置し、そのファイルを /etc/profile.d ディレクトリに配置する必要があります。

非対話型、非ログインの呼び出し方法には、特別な注意が必要です。 この呼び出し方法により、Bash は BASH_ENV 変数をチェックします。 この変数が定義されている場合、それが参照するファイルはソースになります。 PATH 環境変数に格納されている値は、BASH_ENV の処理時には使用されないことに注意してください。 そのため、ソースにするファイルへのフル パスが含まれている必要があります。 たとえば、~/.bashrc ファイルの設定を、非対話的に実行するシェル スクリプトで利用できるようにしたい場合、/etc/profile.d/custom.sh という名前のファイルに次のようなものを配置できます。

                # custom.sh
.
.
.
#If Fedora Workstation
BASH_ENV="/home/username/.bashrc"
.
.
.
#If Fedora Silverblue Workstation
BASH_ENV="/var/home/username/.bashrc"

export BASH_ENV
              

上記のプロファイル ドロップイン スクリプトにより、すべてのシェル スクリプトが実行される直前に、ユーザーの ~/.bashrc ファイルが読み込まれます。

通常、ユーザーはシステム環境をカスタマイズして、自分の仕事の習慣や好みに合わせます。 ユーザーが行えるカスタマイズの例として、エイリアスがあります。 同じセットの開始パラメーターで頻繁に実行されるコマンドは、エイリアスの候補として適しています。 以下に示す ~/.bashrc ファイルには、いくつかのエイリアスの例が用意されています。

                # .bashrc
# Source global definitions
if [ -f /etc/bashrc ];
   then . /etc/bashrc
fi
.
.
.
# User specific aliases and functions
alias ls="ls -hF --color=auto"
alias la="ls -ahF --color=auto"
# make the dir command work kinda like in windows (long format)
alias dir="ls --color=auto --format=long"
# make grep highlight results using color
alias grep='grep --color=auto'
              

エイリアスは、システムのさまざまなコマンドをカスタマイズする方法です。 コマンドをより使いやすくし、キーストロークを減らすことができます。 ユーザーごとのエイリアスは、多くの場合、ユーザーの ~/.bashrc ファイルで構成されます。

コマンドラインの履歴を何度も振り返っている場合は、履歴設定を構成することをお勧めします。 ユーザーごとの履歴オプションも ~/.bashrc で構成できます。 たとえば、一度に複数の端末を使用する習慣がある場合は、histappend オプションを有効にすることをお勧めします。 Bash 固有のシェル オプションブール値本質的に (値として on または off を取る) は、通常、shopt 組み込みコマンドを使用して有効または無効にします。 より複雑な値 (HISTTIMEFORMAT など) を取る Bash 設定は、環境変数に値を割り当てることによって構成される傾向があります。 シェル オプションと環境変数の両方を使用して Bash をカスタマイズする方法を以下に示します。

                # Configure Bash History

# Expand dir env vars on tab and set histappend
shopt -s direxpand histappend

#  - ignoreboth = ignorespace and ignoredup
HISTCONTROL='ignoreboth'

# Controls the format of the time in output of `history`
HISTTIMEFORMAT="[%F %T] "

# Infinite history
# NB: on newer bash, anything < 0 is the supported way, but on CentOS/RHEL
# at least, only this works
HISTSIZE=
HISTFILESIZE=

# or for those of us on newer Bash
HISTSIZE=-1
HISTFILESIZE=-1
              

上記の例に示されている direxpand オプションにより、Bash は、ファイル名の補完を実行するときにディレクトリ名を単語展開の結果に置き換えます。 これにより、readline 編集バッファーの内容が変更されるため、入力した内容は、補完によって展開される内容によってマスクされます。

HISTCONTROL 変数は、コマンド履歴の一部のフィルタリング オプションを有効または無効にするために使用されます。 この設定を構成することで、重複する行、先頭に空白がある行、またはその両方をコマンド履歴から除外できます。 私がヒントを得たエンジニア、Dusty Mabe の言葉を借りると、次のようになります。

ignoreup は、履歴に重複したエントリを記録しないようにします (コマンドを何度も実行している場合)。 ignorespace は、前にスペースがあるエントリを無視します。これは、シークレットを使用して環境変数を設定したり、ディスクに記録したくないシークレットを使用してコマンドを実行したりする場合に役立ちます。 ignoreboth は両方を行います。

Dusty Mabe – Redhat プリンシパル ソフトウェア エンジニア、2020 年 6 月 19 日

コマンドラインで多くの作業を行うユーザーのために、Bash には CDPATH 環境変数があります。 CDPATH が検索するディレクトリのリストで構成されている場合、cd コマンドは、最初の引数として相対パスを指定すると、リストされたすべてのディレクトリをチェックして、一致するサブディレクトリを探し、最初に見つかったディレクトリに変更します。

                # .bash_profile

# set CDPATH 
CDPATH="/var/home/username/favdir1:/var/home/username/favdir2:/var/home/username/favdir3"

# or could look like this
CDPATH="/:~:/var:~/favdir1:~/favdir2:~/favdir3"
              

CDPATH は、PATH が通常更新されるのと同じ方法で更新する必要があります。以前の値を保持するために、割り当ての右側でそれ自体を参照します。

                # .bash_profile

# set CDPATH
CDPATH="/var/home/username/favdir1:/var/home/username/favdir2:/var/home/username/favdir3"

# or could look like this
CDPATH="/:~:/var:~/favdir1:~/favdir2:~/favdir3"

CDPATH="$CDPATH:~/favdir4:~/favdir5"

              

PATH は、もう 1 つの非常に重要な変数です。 これは、システム上のコマンドの検索パスです。 一部のアプリケーションでは、適切に機能するために独自のディレクトリを PATH 変数に含める必要があることに注意してください。 CDPATH と同様に、PATH に新しい値を追加するには、割り当ての右側にある古い値を参照します。 代わりに新しい値を先頭に追加する場合は、古い値 ($PATH) をリストの最後に配置します。 Fedora では、リストの値はコロン文字 (:)。

                # .bash_profile

# Add PATH values to the PATH Environment Variable
PATH="$PATH:~/bin:~:/usr/bin:/bin:~/jdk-13.0.2:~/apache-maven-3.6.3"

export PATH
              

コマンド プロンプトは、カスタマイズのもう 1 つの一般的な候補です。 コマンド プロンプトには、7 つのカスタマイズ可能なパラメーターがあります。

PROMPT_COMMAND設定されている場合、値は各プライマリ プロンプト ($PS1) を発行する前にコマンドとして実行されます。

PROMPT_DIRTRIMゼロより大きい数値に設定すると、その値は、w および W プロンプト文字列エスケープを展開するときに保持する末尾のディレクトリ コンポーネントの数として使用されます。 削除された文字は省略記号に置き換えられます。

PS0このパラメーターの値は、PS1 のように展開され、コマンドを読み取った後、コマンドが実行される前に対話型シェルによって表示されます。

PS1プライマリ プロンプト文字列。 デフォルト値は「sv$'。 …

PS22 番目のプロンプト文字列。 デフォルトは「>'。 PS2 は PS1 と同様に展開されて表示されます。

PS3このパラメーターの値は、select コマンドのプロンプトとして使用されます。 この変数が設定されていない場合、select コマンドは '#?'

PS4このパラメーターの値は PS1 のように展開され、展開された値は、-x オプションが設定されている場合にコマンド ラインがエコーされる前に出力されるプロンプトです。 展開された値の最初の文字は、必要に応じて複数回複製され、複数レベルの間接参照を示します。 デフォルトは「+'。

Bash のリファレンス ドキュメント
Edition 5.0、Bash バージョン 5.0 用。
2019年5月

Bash のこの 1 つの側面に 1 つの記事を割くことができます。 大量の情報と使用可能な例があります。 プロンプトの再構成を含むいくつかのドットファイルの例は、この記事の最後にリンクされているリポジトリで提供されています。 リポジトリで提供されている例を自由に使用して試してみてください。

結論

Bash がどのように機能するかについて少し知識がついたので、自分のニーズや好みに合わせて Bash ドットファイルを自由に変更してください。 プロンプトをきれいにします。 エイリアスを作成することに夢中になります。 または、コンピューターを本当に自分のものにします。 インスピレーションを得るために、/etc/profile、/etc/bashrc、および /etc/profile.d/ の内容を調べます。

端末エミュレーターに関するいくつかのコメントは、ここに当てはまります。 お気に入りの端末を思い通りに動作するようにセットアップする方法があります。 すでにお気付きかもしれませんが、多くの場合、この変更は、ユーザーのホーム ディレクトリにある … ちょっと待って … ドットファイルで行われます。 端末エミュレーターはログイン セッションとして起動することもでき、ログイン セッションを常に使用する人もいます。 端末とコンピューターの使い方は、ドットファイルをどのように変更するか (または変更しないか) に影響します。

コマンド ラインで現在のセッションの種類を知りたい場合は、次のスクリプトを使用すると、それを判断できます。

                #!/bin/bash

case "$-" in
   (*i*) echo This shell is interactive ;;
   (*) echo This shell is not interactive ;;
esac
              

上記をファイルに配置し、実行可能としてマークし、実行して、現在のシェルのタイプを確認します。$- は、文字を含む Bash の変数です。シェルがインタラクティブな場合。 または、単に $- 変数をエコーして、出力に存在するかどうかを検査することもできます。国旗:

                $ echo $-
              

参考情報

詳細と例については、以下の参考文献を参照してください。 Bash の man ページも優れた情報源です。 ローカルの man ページには、実行している Bash のバージョンの機能が記載されていることが保証されていますが、オンラインで見つけた情報は古すぎる (古い) か、新しすぎる (システムでまだ利用できない) 場合があります。

https://opensource.com/tags/command-line

https://opensource.com/downloads/bash-cheat-sheet

ダウンロードするには、上記のサイトで有効な電子メール アドレスを入力するか、サインアップする必要があります。

https://opensource.com/article/19/12/bash-script-template

サンプルのドットファイル、ヒント、およびその他のスクリプト ファイルの形式でこの記事に貢献したコミュニティ メンバー:

  • Micah Abbott – プリンシパル クオリティ エンジニア
  • John Lebon – プリンシパル ソフトウェア エンジニア
  • ダスティ・メイブ – プリンシパル・ソフトウェア・エンジニア
  • Colin Walters – シニア プリンシパル ソフトウェア エンジニア

サンプルのドットファイルとスクリプトのリポジトリは、次の場所にあります。

https://github.com/TheOneandOnlyJakfrost/bash-article-repo

上記のリポジトリで提供されている情報を注意深く確認してください。 一部古くなっている場合があります。 Bash 用のドットファイルだけでなく、開発用のカスタム スクリプトやペット コンテナーのセットアップの例も多数あります。 John Lebon のドットファイルから始めることをお勧めします。 それらは私が見た中で最も詳細なものであり、全体を通して非常に優れた説明が含まれています. 楽しみ!