.bashrcおよび.bash_profileを理解する


26

サーバーでルートとしてログインすると、.bashrc(Ubuntu 10.10)が表示されます。

私のMacには .bash_profile

Ubuntuには常に.bashrcファイルのみがあり、ファイルはありません.bash_profileか?(私はただ混乱しているので、尋ねると、それらは異なるo / sのものであるとわかりますが、おそらく何らかの関係があるのでしょうか?)

私のサーバーで、エイリアスを作成したいのですが、それを入れるべき.bashrcですか?

このエイリアスを適用して、すべてのユーザーが使用できるようにするにはどうすればよいですか?


1
askubuntu.com/questions/1528/bashrc-or-bash-profileと重複する可能性があります-エイリアスをグローバルに配置する場所を尋ねるように質問を変更することをお勧めします。

回答:


39

Bashエイリアスは、個々のホームディレクトリの.bash_aliasesまたは.bashrcファイルに配置する必要があります。グローバルbashエイリアスを作成する必要がある場合、それらはに入ることができますが/etc/bash.bashrc、多くの場合、単純にそれらをに追加する.bash_aliasesか、.bashrcファイルを/etc/skel新しく作成したユーザーに継承されるようにするのが最善です。

事実上、常に間違っ内に別名を定義するために.profile.bash_profileまたは/etc/profile

理由を理解するに、これらの各ファイルからコマンドが実行される状況を理解する必要があります。これについては誤解がありますが、以下で対処します。

エイリアスを複数のユーザーに定義したい場合でも、個々のユーザーに対してエイリアスがどのように定義されているかに精通している必要があります。これにより、必要なことを行う最適な方法を決定できます。

個々のユーザーのエイリアス

特にGUIを使用する場合、対話型シェルのほとんどはおそらく非ログインシェルです。GUIを使用したことがない場合でも、おそらくある程度の頻度で非ログインシェルを使用する可能性があります。これらのシェルでエイリアスを機能させたいでしょう。

特に、仮想コンソールまたはSSHを介して非グラフィカルにログインする場合は、おそらくログインシェルを使用することがあります。そのため、対話型ログインシェルでもエイリアスを機能させる必要があります。

対話型の非ログインシェルが起動する.bashrc、ユーザーのホームディレクトリをソースとします。Ubuntuのデフォルトでは、各ユーザーの.bashrcソース.bash_aliasesが存在する場合、ソースです。

  • ファイルを入手するには、その内容を現在のシェルで実行します。ソースされたファイルで行われたシェル環境への変更は、ファイル内のすべてのコマンドが実行された後でも保持されます。

Ubuntuのデフォルトのコメントを読む、エイリアスがまたはに入る.bashrcことが公式に意図されていることがわかります。すでにいくつかのエイリアス定義が含まれており(それらを表示するために実行されます)、新しい定義をどこに置くかについて明示的なアドバイスを与えます.bashrc.bash_aliases.bashrcgrep '^[[:blank:]]*alias' ~/.bashrc

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

しかし、対話型ログインシェルはどうでしょうか。代わりに.bashrc、ログインシェルソース.profile

  • ... .bash_login存在しない限り、代わりにソースされます。
  • ない限り... .bash_profile存在している、そしてそれは代わりに供給されます。

しかし、良いニュースは、Ubuntuのデフォルトで、ということであるのコマンドが.bashrcしますまた、対話的なログインシェルで実行するデフォルトのため、.profile現在のシェルはbashのかどうかをチェックする(そして場合.bashrcに存在する)、そうであれば、ソース.bashrc

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

ユーザー.bash_aliasesは、ホームディレクトリで新しいbashエイリアスを定義することをお勧めします(まだ存在しない場合は作成します)。これは、ユーザーごとにエイリアス定義を永続的にするための特にクリーンでシンプルな方法です。

エイリアスは.profile、非ログインシェルでは未定義のままになるため、定義しないください。多くのbashシェルの環境とは異なり、エイリアスは子シェルにエクスポートされません

ek@Io:~$ alias hi='echo "Greetings, $USER!"'
ek@Io:~$ hi
Greetings, ek!
ek@Io:~$ bash
ek@Io:~$ hi
hi: command not found

特に、デフォルトでは、ほとんどのデスクトップ環境.profileではグラフィカルログインが使用されますが、

  1. これは必ずしもbashシェルによって行われていないので、エイリアスの定義があっても処理されないことがあり、さらに重要なことと
  2. エイリアス定義が処理されても、それらは子プロセスに渡されません。特に、ターミナルウィンドウを開いて作成されたシェルには渡されません!

エイリアスは.bash_profile.bash_login、まったく同じ理由(または定義されるべきではありませんが、別の理由でも定義されるべきです。これらのファイルの1つを単純に作成し、その中にエイリアス定義を置くだけで、コードの.profile実行が妨げられます!

.bash_profileまたは.bash_login実際に役立つ状況では、通常.profile、その中のどこかにソースがあり、それがその問題を解決します。(その後、唯一の問題は、と同様に.profile、エイリアスを定義する.bash_profileか、.bash_login正しく機能しないことです。)

新しい個人ユーザーのエイリアス、自動的に

実際の人間を表すことを目的としたタイプのユーザーアカウントが作成されると、通常、新しいディレクトリがホームディレクトリとして機能するように作成されます。/etc/skelその後、コンテンツがホームディレクトリにコピーされます。これは、複数のユーザーがホームディレクトリにある類似の構成ファイルで開始する方法です。Ubuntuのでは、これは、.profile.bashrc、およびいくつかの他のファイル。

新しいユーザーに対して定義されるエイリアスを変更するには、単にエイリアス/etc/skel/.bash_aliasesを作成するか(作成する必要があります)またはを使用します/etc/skel/.bashrc

既に存在するファイルを編集する場合は、/etc/skel最初にバックアップすることをお勧めしますが、バックアップをに配置しないでください。そうしない/etc/skelと、新しいユーザーのホームディレクトリにコピーされます。

これは、複数のユーザーに新しいエイリアスを追加するのに最適な方法です。既存のユーザーは、単に自分でエイリアスを追加できます。でエイリアスを定義する場合/etc/skel/.bash_aliases、単にそのファイルにそれらを向けることができ、それらはホームディレクトリにコピーする(または独自のカスタム.bash_aliasesファイルに追加する)ことを選択できます。

ユーザーがエイリアスの定義を解除するのは簡単です。また、エイリアスは非常に堅牢ではありません。特定の状況でのみ機能します。すべてのユーザーに対して常に機能する新しいコマンドを作成する必要がある場合は、そのコマンドをエイリアスとして実装しないでください。また、エイリアスを望まないユーザーにエイリアスを強制的に強制することはできませんunalias

グローバルエイリアス、すべてのユーザー向け

このアプローチを避けることをお勧めしますが、グローバルファイルでエイリアスを定義できます。これらは、対話型の非ログインシェルと対話型ログインシェルの両方に対して定義されます。その理由は、ある前に、ユーザーのホームディレクトリ内のファイルのいずれかが供給されています: /etc/bash.bashrc

  • ログインシェル(およびログインシェルと、ログインシェルのように動作する他のプロセスのみ)は、コマンドを/etc/profile自動的に実行します。
  • 非ログインシェルのみがコマンドを/etc/bash.bashrc自動的に実行しますが、
  • Ubuntuのデフォルトで/etc/profileは、実行中のシェルがbash(および/etc/bash.bashrc存在する場合)であるかどうか、および存在する場合はsources がチェックされます/etc/bash.bashrc

これは、シェルがbashである場合のデフォルトのユーザーごとの.profileソースの指定方法に似ています.bashrc(上記で説明)。

これのデフォルトの実際のコードは次の/etc/profileとおりです。

if [ "$PS1" ]; then
  if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1='\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  else
    if [ "`id -u`" -eq 0 ]; then
      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi

そのブロックは他のタスクも実行します。具体的には、外側のif現在のシェルは、チェックシェル可能性が高い(プロンプトテキストが空であることをチェックすることにより)対話する場合、次にチェックbashのソースがある場合/etc/bash.bashrc、それがあれば、そうでない場合は、いくつかの作業を行い、そのbashのための、すでにで行われてい/etc/bash.bashrcます。

あなたはすべきではないでグローバルエイリアスを定義し/etc/profile、ユーザーが自分の地元でそれらを定義するべきではないのと同じ理由のために.profileS:あなたがしなければ、彼らは唯一のログインシェルのためではなく、その子の殻のために定義されます。

最後に、デフォルトのper-userとは異なり.bashrc、デフォルト/etc/bash.bashrcファイルにはエイリアスに関する情報は含まれていません。ユーザーがファイルを編集したり無効にしたりすることができない場合、ユーザーにエイリアスを与えることはやや珍しいことです。(もちろん、彼らはまだすることができ、自分の地元でそれらの定義をオーバーライドすることによって、それを行う.bashrc.bash_aliasesまたは他の場所。)

参考文献


5

ここにいくつかの素晴らしい読書があります。「.bash_profileはログインシェルに対して実行され、.bashrcは対話型の非ログインシェルに対して実行されます」

そのため、エイリアスには.bash_profileを使用します


4
エイリアスの入力.bash_profileは正しくありません。Ubuntuでは、.profile(ログインシェルに対して実行されます).bashrc対話型bashシェルであるときにソースを取得します。したがって、エイリアスを.bashrc(または.bash_aliases、ソース.bashrc)に置くと、すべてのインタラクティブなbashシェルでエイリアスが定義されます。でエイリアス.bash_profile利回りこの問題はとりわけ、。参照してください。これをという私の答えは、デフォルト~/.bashrcのコメントがあったりで入れエイリアスを推薦さん.bash_aliases
エリアケイガン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.