2020年01月21日 に更新

.profile、.bashrc、.bash_profileの違い

ホーム>実用 【Linux】環境変数の確認・設定・削除・永続化について2019年7月26日  Twitter  Facebook  Pin it  LinkedIn  Pocket  Copy Linuxでは環境変数を確認したり設定したりすることがよくありますので、それらの方法をまとめておきます。 ※基本的にシェルはbashを使用している前提です 目次1 環境変数の確認2 環境変数の設定3 環境変数の削除4 環境変数の永続化4.1 注意5 シェルスクリプトでの環境変数の設定5.1 おすすめ記事 環境変数の確認 envコマンドで設定されている環境変数の一覧を確認できます。 $ env TERM=xterm SHELL=/bin/bash HISTSIZE=32767 SSH_CLIENT=x.x.x.x nnnnn mm SSH_TTY=/dev/pts/0 HISTFILESIZE=32767 USER=xxxxxxxxxxxxx ・・・(以下略)・・・ exportコマンドにpオプションでも確認可能です。 $ export -p declare -x CONCURRENCY_LEVEL="2" declare -x HISTFILESIZE="32767" declare -x HISTSIZE="32767" declare -x HOME="/home/xxxxxxxxxxxxx" declare -x LANG="C" declare -x LOGNAME="xxxxxxxxxxxxx" ・・・(以下略)・・・ もちろんechoコマンドを使用すれば対象の環境変数の内容を表示できます。 $ echo $TERM xterm 環境変数の設定 以下のようにexportコマンドで設定可能です。 $ export HOGE=2000 以下のようにすることも可能です $ HOGE=1000 export HOGE 環境変数の削除 unsetコマンドを使えば簡単に環境変数を削除できます。 $ unset HOGE exportコマンドでもnオプションを付ければ削除可能です。 $ export -n HOGE 環境変数の永続化 シェルに依存しない環境変数の設定などは~/.profileに記述することが推奨となっています。 注意 間違って~/.bashrcや~/.bash_profileに環境変数の設定を書かないようにしましょう。 ※上記2ファイルはbashシェル用の物であり、bashシェルのエイリアスやプロンプト設定を行うために用意されており、出力などを行ってはいけないなどの制約もあります。 シェルスクリプトでの環境変数の設定 普通にシェルスクリプトを起動すると子プロセスとして実行され、実行後は親プロセスに環境変数は引き継がれません。 そこで、シェルスクリプトで環境変数を反映させるにはsourceコマンドを使用します。 #set_hoge_env.shの内容 HOGE=1000 export HOGE $ source ./set_hoge_env.sh 現在のシェルでスクリプトが実行されますので、現在のシェルに実行したスクリプトの環境変数が反映されます。 おすすめ記事【Linux】カーネル起動オプションについて【Linux】OSブート時のfsck自動実行についてbashで一定時間無操作後に自動ログアウトさせる方法【Linux】管理者がログイン直後によく使うコマンド【Linux】Debianのバージョン確認方法とコードネーム対応表sigやascファイル(GPG signature)の検証方法 実用Linux, コマンド, 環境変数, 確認, 設定Posted by ac-as.net よろしければシェアお願いします  Twitter  Facebook  Pin it  LinkedIn  Pocket  Copy 【Linux】OSブート時のfsck自動実行についてNext 仕事に疲れたらさっさと休んで休養すべきPrev 関連記事 【YouTube】ゲームプレイ動画の作り方や設定を公開【PC】 現在、YouTubeのアカスのゲームルームチャンネルにてゲームの実況プレイ動画を ... 【Linux】OSブート時のfsck自動実行について Linuxでは一定条件でOSブート時にfsckによるファイルシステムのチェックが ... 【Linux】カーネル起動オプションについて LinuxではOSの起動時にカーネルに各種オプションを渡して設定を変更することが ... 【Linux】EXT4ファイルシステムのデフラグ 近年のLinuxディストリビューションでは、デフォルトのファイルシステムとしてE ... 【Linux】意外と知らないcdコマンドの便利な使い方 ターミナル上の作業で欠かす事の出来ないコマンドにcdがあります。 ディレクトリを ... このアカスブログは全てリンクフリーです。 無断リンクして頂いて全く問題ございません。(※転載は禁止) 相互リンク希望の方は「お問合せ」かTwitterのDMにご連絡ください。人気の記事 NICのオフロード設定の変更方法(Linux)【Linux】カーネルパラメータのパフォーマンスチューニングについてヨドバシドットコムに返品の問い合わせして返金してもらった話エンジニアおすすめのプログラミングスクールを比較【Linux】環境変数の確認・設定・削除・永続化について最近の投稿 Realtek製オーディオの最新ドライバを入手する方法 postfixのメールアドレスのエイリアスを追加する方法 ネット系の大規模サービスでは通信量とレスポンスタイムがとても重要 【FX初心者】アカスブログ2019年11月実績【FXのやり方は簡単】 同一労働同一賃金が来年4月に施行される事により大転職時代の到来カテゴリー レポート (195) 実用 (91)アーカイブ 2020年1月 (2) 2019年12月 (2) 2019年11月 (23) 2019年10月 (31) 2019年9月 (30) 2019年8月 (31) 2019年7月 (31) 2019年6月 (30) 2019年5月 (31) 2019年4月 (30) 2019年3月 (21) 2019年2月 (7) 2019年1月 (13) 2018年12月 (3) 2018年11月 (1) おすすめ記事【Linux】カーネル起動オプションについて【Linux】OSブート時のfsck自動実行についてbashで一定時間無操作後に自動ログアウトさせる方法【Linux】管理者がログイン直後によく使うコマンド【Linux】Debianのバージョン確認方法とコードネーム対応表sigやascファイル(GPG signature)の検証方法 PAGE TOP
TOP 開発 Linux: .bashrcと.bash_profileの違いを今度こそ理解する 開発 2019.06.06 Linux: .bashrcと.bash_profileの違いを今度こそ理解する hachi8833 シェア ツイート ブックマーク LINE こんにちは、hachi8833です。社内Slackで見かけたmorimorihogeさんの以下の書き込みで目から鱗が落ちました。 ~/.bashrcで何かを出力してしまうと、rsyncなどのsshパイプで問題が生じることがあるそうです。 参考: 知らないとrsyncでもハマるシェル初期化 - Qiita これをきっかけに、できるかぎり一次情報を元になるべく一般的になるようにまとめてみました。 シェルスクリプト(.bashrcや.bash_profileなども含む)はあまりに自由に書けてしまい、ディストリビューション(macOS)などによって作法がまちまちだったりするので、外してはいけないポイントがどこかを知りたかったのでした。 対象はbashとsh(Bourne Shell)に限定します。また、デスクトップGUIの設定ファイルについては最小限にとどめます。 .bashrcの「rc」は「run command」の略だそうです(参考: bit Frequently Asked Questions [UNIX] 1)。 bashのmanページ 元記事: bashの日本語manページ「起動」 ディストリビューションに依存しない一次資料となるとやはりman bashだろうというアドバイスがmorimorihogeさんからありました。 bash が対話的なログインシェルとして起動されるか、 –login オプション付きの非対話的シェルとして起動されると、/etc/profileファイルが存在すれば、 bash はまずここからコマンドを読み込んで実行します。 このファイルを読んだ後、 bash は ~/.bash_profile, ~/.bash_login, ~/.profile をこの順番で探します。 bash は、この中で最初に見つかり、かつ読み込みが可能であるファイルから コマンドを読み込んで実行します。 同日本語manページより bashのmanページは長大かつ非常に詳細です。「どう動くか」についての説明はものすごく詳しいのですが、「どう運用すべきか」についての説明はほとんどありません。 正直、日本語になってても非常に読みづらいのですが、細かな点については最終的にここで確認するのが確実だと思います。 Stackoverflowの回答 これまたmorimorihogeさんがStackoverflowの回答の中から「いいね」数の多い回答を抜粋してくれました。 回答1 元記事: bash - Difference between .bashrc and .bash_profile - Super User 以下に要点を補足しつつ記します。 Unixシステムでは「プログラムを起動するためのプログラム」が起動される。これがコマンドラインシェル(いわゆるシェル)と呼ばれる。 デフォルトのシェルはBourne shell(いわゆる/bin/sh)と呼ばれ、「ログインシェル」として起動するときに~/.profileを読み込む。 (Bourneは作者の名前) bashはBourne shellに似ているがより高機能で、「ログインシェル」として起動すると~/.bash_profileを読み込む。~/.bash_profileがなければ~/.profileを読み込もうとする。 シェルがログインシェルではない形で起動する場合は、~/.profileを読み込まない。 bashを対話的シェル(=スクリプト実行用ではないということ)として起動するときは、~/.bashrcを読み込む。 上を踏まえて、次のように使い分けることが勧められています。 設定ファイル 利用法 例 ~/.profile ・ログイン時にそのセッション全体に適用するものを記述する・シェルの種類に依存しないものを記述する ・環境変数など ~/.bashrc ・bashでしか使わないものを記述する ・エイリアス・シェルオプション・プロンプト設定 ~/.bash_profile ~/.profileと同じに使えるが、bashのみで有効 bashを対話的に使う場合、~/.bash_profileに次を書いておくことを推奨する。 .profileがあれば読み込む設定 bashが対話モードであれば~/.bashrcを読み込む設定 「環境変数も~/.bashrcに書け」とか「ターミナルで常にログインシェルを起動しろ」と言ってる記事がよくあるが、どちらもマズいやり方。 これをやるとターミナル以外から起動するプログラム(GUI起動など)に環境変数が渡らなくなってしまうのが最大の問題。 回答2 元記事: unix - Choosing between .bashrc, .profile, .bash_profile, etc - Super User こちらも要点を以下にまとめます。 設定ファイル コツ 例 ~/.profile ・bashに依存しないものだけを書く・GUIアプリで使うものやbin/shで使うものはここに置く(必須)・ログインシェルで使うものはここに置くべき ・環境変数・PATH変数・etc ~/.bashrc ・対話モードで使うものはすべてここに書く・ここでは何も出力してはならない ・エイリアス・EDITOR変数・プロンプト設定・etc ~/.bash_profile ・余計なものは極力書かない・右の順に読み込むだけにする ・~/.profileがあれば読み込む・~/.bashrcがあれば読む ~/.bash_loginは存在しないようにしておこう 冒頭のスクショと同様、~/.bashrcからは(標準出力や標準エラーに)何も出力してはならないと注意されていますね。 まとめ 上の回答は、設定ファイルの振る舞いや意義を手短に解説しつつ、bash以外でも極力使うにはこう書くのがよいというアドバイスになっています。 そこまで厳密に書かなくても動くのが設定ファイルですし、書き方は人それぞれになると思います。 しかし、少なくとも~/.bashrcで何も出力してはならない、という部分は外さないようにする必要があります。 自分の場合 私も、ローカルVMのUbuntu 18.04.1 Server LTS環境で上のアドバイスに沿って、.profileと.bashrcと.bash_profileを設定しました。 ~/.bash_profile: .profileと.bashrcの存在確認&読み込みだけ(何も足さない) ~/.profile: 環境変数やGUI設定はここに書く(bashに依存しないもの) ~.bashrc: bashに依存する対話モード向け設定はここに書く 念のため標準出力や標準エラー出力に出力しないよう注意する 設定は、.bashrc冒頭の非対話モード脱出コードの後に置く(後述) ~/.bash_alias: (自分で追加)エイリアスはここに書く 自分の場合エイリアスの追加頻度が多いので、.bash_aliasという別ファイルを作成してそこに書くようにし、.bashrcで.bash_aliasを存在チェックしつつ読み込むようにしています。 ~/.bash_loginは使っていません。 なお、macOSのbash設定もUbuntuのbash設定と同じ方針で設定し、そこにmacOS固有の設定を追加しました。 追記(2019/06/07) 上に書いた私の設定方針は、自分だけが普段づかいするbash環境向けであり、今後自分の環境でbash以外のシェル(zshとかfishとか)を試してみる可能性や、LinuxデスクトップGUIを試す可能性(しないと思いますが?)をうっすら考えています。 少なくともデスクトップGUIやbash以外の環境を使いそうにない業務用Linuxサーバーでは、.profileがない場合にわざわざ作成したり、エイリアス用設定ファイルまで置いたりするのはトゥーマッチになることがあるかもしれないと個人的に感じています(プロジェクトでポリシーが決められていれば別)。 参考: Ubuntu Server LTSのデフォルト設定 Ubuntu 18.04.1 Server LTSは、デフォルトでは~/.profileで対話モードかどうかを判断し、対話モードの場合に~/.bashrcを読み込むようになっています。 ただし、~/.bash_profileや~/.bash_loginがある場合は対話時に~/.profileではなくそれらを読み込みます。 # `~/.profile` # if running bash if [ -n "$BASH_VERSION" ]; then # include .bashrc if it exists if [ -f "$HOME/.bashrc" ]; then . "$HOME/.bashrc" fi fi かつ、デフォルトの/etc/bash.bashrcと~/.bashrcの冒頭にも、それぞれ以下の設定が記載されています。 # /etc/bash.bashrc # If not running interactively, don't do anything [ -z "$PS1" ] && return # ~/.bashrc # If not running interactively, don't do anything case $- in *i*) ;; *) return;; esac いずれも、bashが対話的でない場合は即脱出し、それより後の行なら何を書いても決して出力されることのないようになっています。 つまり、~/.bashrcが非対話モードで誤って何かを出力しないよう、二重に対策が行われています。 参考: CentOS 7のデフォルト設定 CentOS Linux release 7.5.1804 (Core)の場合、以下のようになっていました。 CentOSでは、従来よくある方式と同様、~/.bash_profileで~/.bashrcが存在するかどうかを調べ、存在すれば読み込むようになっています。 # ~/.bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi 一方、/etc/bashrcでは、対話的な場合にはプロンプトの設定などを行っていますが、非対話の場合の脱出は特に行っていません。 # /etc/bashrc # are we an interactive shell? if [ "$PS1" ]; then if [ -z "$PROMPT_COMMAND" ]; then case $TERM in xterm*|vte*) if [ -e /etc/sysconfig/bash-prompt-xterm ]; then PROMPT_COMMAND=/etc/sysconfig/bash-prompt-xterm elif [ "${VTE_VERSION:-0}" -ge 3405 ]; then PROMPT_COMMAND="__vte_prompt_command" else PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"' fi ;; screen*) if [ -e /etc/sysconfig/bash-prompt-screen ]; then PROMPT_COMMAND=/etc/sysconfig/bash-prompt-screen else PROMPT_COMMAND='printf "\033k%s@%s:%s\033\\" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"' fi ;; *) [ -e /etc/sysconfig/bash-prompt-default ] && PROMPT_COMMAND=/etc/sysconfig/bash-prompt-default ;; esac fi # Turn on parallel history shopt -s histappend history -a # Turn on checkwinsize shopt -s checkwinsize [ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[\u@\h \W]\\$ " # You might want to have e.g. tty in prompt (e.g. more virtual machines) # and console windows # If you want to do so, just add e.g. # if [ "$PS1" ]; then # PS1="[\u@\h:\l \W]\\$ " # fi # to your custom modification shell script in /etc/profile.d/ directory fi かつ、~/.bashrcは単に/etc/bashrcに丸投げしています。 # ~/.bashrc # Source global definitions if [ -f /etc/bashrc/ ]; then . /etc/bashrc fi 非対話かつログインでないシェルであれば/bin/shが動くから~/.bashrcも~/.bash_profileも読み込まれないはずなので、Ubuntuのように脱出の条件までは書かないという考え方なのかなと推測しました。 業務で共有するシェル環境のカスタマイズは最小限にしよう 自分のマシン内のプロファイルで自分だけが使うシェル環境であれば、心ゆくまでカスタマイズして構わないと思います。 逆に、業務で使うLinuxサーバーなどで共有するプロファイルや環境変数については、あまりかっ飛んだカスタマイズをすると他の人がメンテするときに支障が生じる可能性があります。 特に、サーバープロセスで使うユーザーについては不必要なカスタマイズを極力避けたいと思いました。 もちろん、業務で使うサーバーでも、作業者が自分のプロファイルを作って作業する分にはある程度好きにカスタマイズできると思いますが、作業手順が自分のプロファイルに依存すると作業の引き継ぎが面倒になるので、やはりカスタマイズは控えめがよさそうです。 おたより発掘 良いまとめ。今は自分も人に教えることが多いので.profileとかに毎回環境変数やエイリアスだけをまとめて、極力激しいシェルカスタマイズはしないようにしてるなぁ。昔はゴリゴリにいじってたけど。 / “Linux: .bashrcと.bash_profileの違いを今度こそ理解する” https://t.co/aTI3wvkaOy — sifue(吉村 総一郎) (@sifue) June 6, 2019 関連記事 Linux CUI初心者に早く知っておいて欲しいコマンド操作 Mac: Parallels Desktop for MacでUbuntu Server LTS環境を構築する シェア ツイート ブックマーク LINE この記事を書いた人 hachi8833 Twitter: @hachi8833、GitHub: @hachi8833 コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。 これまでにRuby on Rails チュートリアル第2版の監修および半分程度を翻訳、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れて更新翻訳中。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 実は最近Go言語が好きで、Goで書かれたRubyライクなGoby言語のメンテナーでもある。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。 hachi8833の書いた記事一覧へ タグ #bash #CentOS #Linux #Ubuntu New Posts Ruby / Rails関連 勉強会 銀座Rails#17で「出張Railsウォッチ」発表させていただきました Ruby / Rails関連 開発 週刊Railsウォッチ(20200120前編)福岡でも公開つっつき会、Railsのconnection_specification_nameでprimaryという名前が非推奨に、structure.sqlとschema.rbほか Ruby / Rails関連 開発 Rails 6: Webpacker+Yarn+Sprocketsを十分理解してJavaScriptを書く: 後編(翻訳) プレス・実績・お知らせ 1月29日・30日、会社説明@福岡を希望してくださる方いましたら、伺います Ruby / Rails関連 開発 Rails 6: Webpacker+Yarn+Sprocketsを十分理解してJavaScriptを書く: 前編(翻訳) Category IT Tips Ruby / Rails関連 Ruby / Rails関連以外 インフラ デザイン プレス・実績・お知らせ 勉強会 開発 Ranking 1 ライフ メガネに今の倍額以上を投資してマジ世界が変わった 2 開発 自宅PCのOSをWindowsからLinux(ubuntu)に変えてみた感想 3 開発 iOS 13における必須対応について 4 IT Tips Excel で改ページを挿入できない場合の対応方法 5 開発 HTML5のLocal Storageを使ってはいけない(翻訳) #Tags #会社紹介 #自社サービス #勉強会 #Rails #PHP #デザイン #実績 #週刊Railsウオッチ CONTACT お気軽にご相談ください。 関連記事 開発 READ MORE hachi8833 2019.10.09 HTML5のLocal Storageを使ってはいけない(翻訳) IT Tips READ MORE baba 2019.08.14 Microsoft Silverコンピテンシーを取得しました 開発 READ MORE 淳一 千葉 2016.06.06 【速報】HTML5.1は終わり … HTML 5.2の始まり (翻訳) CONTACT TechRachoでは、パートナーシップをご検討いただける方からの ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。 CONTACT FORM
2010.09.13 2010.09.13 ターミナル起動時に.bashrcを読み込むようにするMac OS Xのデフォルトでは、HOMEに.bashrcを作成してもターミナル起動時に自動で読み込むようにはなっていないようなので、自動で読み込むように.bash_profileに記述すると良い模様。 .bash_profileを作成 HOMEに.bash_profileを作成して以下を記述。 if [ -f ~/.bashrc ] ; then . ~/.bashrc fi これでターミナルを再起動すれば、起動時に自動的に.bashrcを読み込んでくれる。 とあるプログラマーの覚書 OSXでのbashrcの設定