f

アーカイブ

2015-09-30

Bash Startup File

Bashの起動時読み込みファイルについて記憶が曖昧だったのでしっかりまとめることにした。

用語・ファイル一覧

最初に登場する用語とファイルを整理する。シェルの起動時ファイルは以下の3種類に分類される。

  • ログインシェル:PCのログイン時のシェル。GUIログイン時も内部的には起動。
  • 対話的非ログインシェル:ログイン時以外で,対話的にコマンドを実行するシェル。例:GUIログイン時にターミナルを起動。
  • 非対話的シェル:非対話的にコマンドを実行するシェル。例:シェルスクリプトの実行時。

また,bashの起動時と終了時に関連する設定ファイルをbashの起動時・終了時ファイルに示した。この表からわかるように一部ディストリビューション特有の設定ファイルが存在する。

bashの起動時・終了時ファイル
ファイル 説明
/etc/profile システム全体用の初期化ファイル
/etc/bash.bashrc システム全体用の初期化ファイル(Debian系のみ)
/etc/bash.bash.logout システム全体用のログインシェル終了時ファイル(Debian系のみ)。
/etc/bash.bash_logout システム全体用のログインシェル終了時ファイル(RedHat系のみ)。
/etc/bashrc 既定の~/.bashrcでこのファイルを実行している。
~/.bash_profile 個人用の初期化ファイル。
~/.bash_login 個人用のログイン時初期化ファイル。
~/.bashrc 対話シェルの個人用の起動ファイル
~/.bash_logout 個人用のログインシェル終了時ファイル。

この表でDebian系とはDebian,Ubuntu,Linux Mintなどを指し,RedHat系とはRedHat,CentOS,Scientific Linuxなどを指す。

以降から上記3分類ごとの起動時ファイルの実行順について記す。

ログインシェル(interactive login shell, or with --login)

  1. /etc/profileが存在すれば実行。
  2. 以下の3ファイルをこの順番で探し,最初に見つかったファイルを実行(但し,Ubuntuは~/.profileしか探さない)。
    1. ~/.bash_profile
    2. ~/.bash_login
    3. ~/.profile
  3. ログインシェルの終了時に,/etc/bash.bash.logoutが存在すれば実行(Debian系のみ)。
  4. ログインシェルの終了時に,~/.bash_logoutが存在すれば実行。
  5. ログインシェルの終了時に,/etc/bash.bash_logoutが存在すれば実行(RedHat系のみ)。

設定ファイルを読み込みたくなかったら--noprofileオプションを使う。

これらのファイルはログイン時やログアウト時に1回だけ実行される。特に理由がなければ編集する必要はない。

bashの設定ファイルとして知られる~/.bashrcはログイン時には直接読み込まれない。これらのprofileやloginとつくファイル内で,~/.bashrcを読み込むように設定されている。また,既定の~/.bashrcでは/etc/bashrcを読み込むように設定されている。

bashは大部分のLinuxのログインシェルとして使われているので,この設定は重要である。例えば,GUIで操作する場合においても,ここでプログラムのPATHが通っているかどうかでDASHなどのGUIの検索画面に表示されるかどうかが変わってくる。また,環境変数の設定もGUIでのプログラム起動などで効いてくる。

なお,Ubuntuは~/.bash_profile~/.bash_loginは無視している。そのため,ログイン時の設定をするならば~/.profileにしたほうがよい。

対話的非ログインシェル(Interactive non-login shell)

  1. /etc/bash.bashrcが存在すれば実行(Debian系のみ)。
  2. ~/.bashrcが存在すれば実行。
  3. /etc/bashrcが存在すれば実行(RedHat系のみ)。

--norcオプションを使えば読み込まない。--rcfile <file>でファイルを指定すれば~/.bashrcの代わりに<file>を実行する。

bashを起動すると毎回実行されるのが~/.bashrcファイルである。基本的にはこのファイルにbashの設定を書くことになる。

非対話的シェル(non-interactively)

シェルスクリプトの実行時など非対話的に起動するとき,BASH_ENV変数(既定値はなし)に設定されているファイルを実行する。以下のコマンドと同じように動作する。

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

もし,--loginオプション付きで非対話シェルが呼び出されたらログインシェルと同じように起動時ファイルを実行する。

BASH_ENV変数に自分で設定ファイル指定することで,シェルスクリプトの実行時の挙動を設定できる。シェルスクリプトの挙動が変わってしまう危険性があるので,基本的にはBASH_ENV変数は設定しないほうがよい。

参考情報

1と2を特に参考にした。

  1.  UbuntuデスクトップでPATHの設定は、~/.bashrc か ~/.bash_profile か ~/.profile のどれに書けばよいのか? - 部屋の中にも一年 http://itiut.hatenablog.com/entry/2013/07/07/114143
  2. bashの設定ファイルの読み込みが複雑すぎて混乱する - ぱせらんメモ http://d.hatena.ne.jp/pasela/20090209/bash
  3. Bourne-Again SHell manual - GNU Project - Free Software Foundation https://www.gnu.org/software/bash/manual/
  4. Ubuntu日本語フォーラム / .bash_profile https://forums.ubuntulinux.jp/viewtopic.php?pid=6667
  5. configuration - When is /etc/bash.bashrc invoked? - Unix & Linux Stack Exchange http://unix.stackexchange.com/questions/187369/when-is-etc-bash-bashrc-invoked

2015-09-26

GnuCash:アカウントの手作業でのマージ

初めにアカウントを作ってその下にサブアカウントを作ったけど,後になってサブアカウントを他の項目にマージさせたくなった。マージさせる方法を調べたので記す。

GnuCashを使い始めた頃に,[費用:食費]の下に[費用:食費:外食]というサブアカウントを作ってみた。しかし,よく考えたらわざわざ外食というカテゴリを作る必要はなく,食費の中にマージさせたくなった。

GnuCashの標準機能に,取引内容を他のアカウントに移動させる方法が見当たらなかった。調べたところ手作業でやるしかなさそうだ。

FAQ - GnuCash http://wiki.gnucash.org/wiki/FAQ#Q:_Is_there_a_way_to_merge_two_accounts_into_one.3F

一応元のXMLを開いて操作すればできるらしいが,危険なので非推奨とのことだ。数が多いとたいへんなのでPythonプラグインあたりを作れたら作りたい。

ひとまず手作業でやる手順を参考として,以下に記す。

  1. 移動させたいアカウントを開く。
  2. [View]→[Style]→[Transaction Journal]([Auto-Split Ledger])を選択。


  3. 画面が切り替わり,現在のアカウント([費用:食費:外食])が選択できるのでここをひたすら([費用:外食]に)切り替えていく。

数が多いとやっていられなくなる。GnuCashの標準機能にはないのでPythonプラグインで一括移動機能を自作するしかないだろう。