/etc/profile.dのスクリプトは無視されますか?


61

私はUbuntuが初めてです。13.10デスクトップを実行しています。

システム全体のエイリアスとbashのカスタムプロンプトを設定したかった。私はこの記事を見つけました:

https://help.ubuntu.com/community/EnvironmentVariables

この記事のアドバイスに従って、/ etc / profiles.d / profile_local.shを作成しました。rootが所有し、そこにある他のスクリプトと同様に644の許可を持ちます。

root@ubuntu:/etc/profile.d# ll
total 28
drwxr-xr-x   2 root root  4096 Mar 23 08:56 .
drwxr-xr-x 135 root root 12288 Mar 23 09:15 ..
-rw-r--r--   1 root root   660 Oct 23  2012 bash_completion.sh
-rw-r--r--   1 root root  3317 Mar 23 07:36 profile_local.sh
-rw-r--r--   1 root root  1947 Nov 23 00:57 vte.sh

/ etc / profileが/etc/profile.dを呼び出すことをさらに確認しました。次のコードブロックが含まれています。

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

ログイン時に、作成したカスタムスクリプトprofile_local.shが入手されたようには見えません。ただし、ログイン後に「/etc.profile.d/profile_local.shをソース」すると、予期される動作、カスタムエイリアス、およびカスタムプロンプトが表示されます。

何が間違っていますか?

スクリプト「profile_local.sh」の内容:

# 3/23/14 - Copied from Gentoo /etc/bash/bashrc
# Placed in /etc/profile.d as described at:
# https://help.ubuntu.com/community/EnvironmentVariables

# This file is sourced by all *interactive* bash shells on startup,
# including some apparently interactive shells such as scp and rcp
# that can't tolerate any output.  So make sure this doesn't display
# anything or bad things will happen !


# Test for an interactive shell.  There is no need to set anything
# past this point for scp and rcp, and it's important to refrain from
# outputting anything in those cases.
if [[ $- != *i* ]] ; then
        # Shell is non-interactive.  Be done now!
        return
fi

# Bash won't get SIGWINCH if another process is in the foreground.
# Enable checkwinsize so that bash will check the terminal size when
# it regains control.  #65623
# http://cnswww.cns.cwru.edu/~chet/bash/FAQ (E11)
shopt -s checkwinsize

# Enable history appending instead of overwriting.  #139609
shopt -s histappend

# Change the window title of X terminals 
case ${TERM} in
        xterm*|rxvt*|Eterm|aterm|kterm|gnome*|interix)
                PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}\007"'
                ;;
        screen)
                PROMPT_COMMAND='echo -ne "\033_${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}\033\\"'
                ;;
esac

use_color=false

# Set colorful PS1 only on colorful terminals.
# dircolors --print-database uses its own built-in database
# instead of using /etc/DIR_COLORS.  Try to use the external file
# first to take advantage of user additions.  Use internal bash
# globbing instead of external grep binary.
safe_term=${TERM//[^[:alnum:]]/?}   # sanitize TERM
match_lhs=""
[[ -f ~/.dir_colors   ]] && match_lhs="${match_lhs}$(<~/.dir_colors)"
[[ -f /etc/DIR_COLORS ]] && match_lhs="${match_lhs}$(</etc/DIR_COLORS)"
[[ -z ${match_lhs}    ]] \
        && type -P dircolors >/dev/null \
        && match_lhs=$(dircolors --print-database)
[[ $'\n'${match_lhs} == *$'\n'"TERM "${safe_term}* ]] && use_color=true

if ${use_color} ; then
        # Enable colors for ls, etc.  Prefer ~/.dir_colors #64489
        if type -P dircolors >/dev/null ; then
                if [[ -f ~/.dir_colors ]] ; then
                        eval $(dircolors -b ~/.dir_colors)
                elif [[ -f /etc/DIR_COLORS ]] ; then
                        eval $(dircolors -b /etc/DIR_COLORS)
                fi
        fi

        if [[ ${EUID} == 0 ]] ; then
                PS1='\[\033[01;31m\]\h\[\033[01;34m\] \W \$\[\033[00m\] '
        else
                PS1='\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\] '
        fi

        alias ls='ls --color=auto'
        alias grep='grep --colour=auto'
else
        if [[ ${EUID} == 0 ]] ; then
                # show root@ when we don't have colors
                PS1='\u@\h \W \$ '
        else
                PS1='\u@\h \w \$ '
        fi
fi

# Try to keep environment pollution down, EPA loves us.
unset use_color safe_term match_lhs

TZ="PST8PDT"

alias ll='ls -la'
alias dig='dig +search'
alias dir='ls -ba'

alias edit="ee"
alias ss="ps -aux"
alias dot='ls .[a-zA-Z0-9_]*'
alias news="xterm -g 80x45 -e trn -e -S1 -N &"

alias more="less"
alias c="clear"
alias m="more"
alias j="jobs"

# common misspellings
alias mroe=more
alias pdw=pwd

1
いいえ、実行できませんが、他の2つのスクリプトも実行できません。しかし、私はそれを変更して再試行しました。まだ運がありません。
ドリュー14年

3
これは追加.shとは関係がなく、無関係であり、とにかくファイルprofile.dがソースされ、実行されず、わずかに異なり、ファイルが実行可能である必要はありません。ここでの問題は、profile&coが非ログインスクリプトによって読み取られないことです。
テルドン

1
ドリュー、私の答えを読んでください。プロファイルファイルは非ログインシェルによって無視されますが、UbuntuのデフォルトのGUIログインはそれらの一部を読み取ります。使用するだけで.bashrc問題はすべてなくなります。また、優先順位の問題もあります。続いて読み取られるファイルの1つでもPS1が設定されると、以前の値は破棄されます。とにかく、真剣に、ファイラーに触れない/etcでください、あなたのホームディレクトリにあるもので遊んで、.bashrcプロファイルではなく使用してください。
テルドン

1
はい、それはログインシェルである必要があります(次回質問に含める必要がある場合は、これが親切です)。ただし、ほとんどのシステムには.profile自宅にデフォルトファイルがあり、その設定はで行ったすべてを上書きします/etc/profile。基本的には決して触れないで/etcあなたは何をやっている知っている限り。それがユーザー固有のファイルの目的です。また、質問を編集して、接続方法を正確に説明してください。
テルドン

4
これを使用しないでください。これ/etc/profile.dは非常に悪い考えであり、システムのすべてのユーザーに影響します。わずかのコマンドが含まれprofile_local.sh、あなたの中に~/.profileあなたにこの行を追加することで、スクリプトをソースまたは単に~/.profile. /path/to/profile_local.sh。(.つまりsource、指定したファイルを読み取り、そこで見つかったコマンドを実行します)。
テルドン

回答:


109

ここで何が行われているのかを理解するには、シェル(この場合はbash)の実行方法に関する背景情報を少し理解する必要があります。

  • gnome-terminalたとえば)ターミナルエミュレータを開くと、対話型の非ログインシェルと呼ばれるものを実行しています

  • コマンドラインからを介してマシンにログインするsshか、などのコマンドsu - usernameを実行すると、対話型ログインシェルが実行されます

  • グラフィカルにログインすると、まったく異なるものが実行されます。詳細はシステムとグラフィカル環境によって異なりますが、一般的にはログインを処理するのはグラフィカルシェルです。多くのグラフィカルシェル(Ubuntuのデフォルトを含む)が/etc/profileすべてを読み取るわけではありません。

  • 最後に、シェルスクリプトを実行すると、非対話型、非ログインシェルで実行されます

現在、起動時にbashが読み取るファイルは、実行中のシェルのタイプによって異なります。以下はman bash(emphasis mine)のINVOCATIONセクションの抜粋です。

bashが対話型ログインシェルとして、または--loginオプションを指定した非対話型シェルとして呼び出されると、bashは、ファイル/ etc / profileが存在する場合、最初にファイル/ etc / profileからコマンドを読み取り、実行します。そのファイルを読み取った後、〜/ .bash_profile、〜/ .bash_login、および〜/ .profileをこの順序検索し、最初に存在する読み取り可能なコマンドからコマンドを読み取り、実行します。--noprofileオプションは、この動作を禁止するためにシェルを起動するときに使用できます。

ときは対話型シェルログインシェルではないが 開始されると、bashは読み込んでからコマンドを実行し/etc/bash.bashrcし、〜/ .bashrcにこれらのファイルが存在する場合、。これは、-norcオプションを使用して禁止できます。--rcfileファイルオプションは、bashに/etc/bash.bashrcおよび〜/ .bashrcの代わりにファイルからコマンドを強制的に読み取らせて実行させます。

これが意味することは、間違ったファイルを編集しているということです。あなたは使用して仮想コンソールにドロップすることで、これをテストすることができますCtrl+ Alt+ F2(とGUIに戻りAlt+ F7、またはF8そこにあなたのセットアップに応じて)とロギング。プロンプトとエイリアスが利用できることがわかります。

そのため、ターミナルを開くたびに取得するタイプである非ログインシェルに適用する設定を行うには、~/.bashrc代わりに変更を行う必要があります。または、ファイルにエイリアスを配置することもできます~/.bash_aliases(ただし、これはUbuntuの機能であり、他のディストリビューションで機能することを期待しないでください)。

どのファイルを何に使用するかの詳細については、こちらを参照してください


ノート:

  • Debian(および拡張機能によりUbuntu)にもデフォルトの~/.profileソースがあります~/.bashrc。これは、すべての変更は、あなたがする作ることを意味~/.bashrcもログインシェルに継承されますが、私)、これはすべてのLinux / Unixマシンではそうではないと、ii)逆に、あなたが一般的に常にで動作するはず理由である真実ではありません~/.bashrcではなく、&​​CO ~/.profile/etc/profile

  • また、使用に関する一般的な注意事項は、構成ファイルに加えられた変更はすべてのユーザーに/etc影響ます。これは通常、あなたがしたいことではなく、避けるべきです。ホームディレクトリ(~/)にある同等のファイルを常に使用する必要があります。

  • さまざまな構成ファイルが順番に読み込まれます。具体的には、ログインシェルの場合、順序は次のとおりです。

    /etc/profile -> /etc/profile.d/* (in alphabetical order) -> ~/.profile

    これは、の設定が~/.profile以前のファイルで設定されたものを上書きすることを意味します。


1
この投稿howtolamp.com/articles/…によるとecho $0、ターミナルから実行することもでき、出力の先頭に「-」が付いている場合はログインシェルにいます。
stackoverflower

@stackoverflowerは私のシステムにはありません。これは、リモートの対話型ログインシェルで機能します。実行中には見えませんbash -l。いずれにせよ、なぜそれが関連するのですか?問題は、実行しているシェルのタイプを確認する方法ではありません。
テルドン

私は同じ問題が持っていたとき、それはGoogleで現れなかった理由雄大なポスト、不思議
ドナート

@stackoverflowerが"$0"で始まるものに展開される場合-、ログインシェルがあることがわかります。しかし、その逆は当てはまり-ません。ログインシェルにいないことを保証するものではありません。ログインシェルを起動する最も一般的な方法では-、すべてではありませんが、先頭になります。man bash教えてくれるログインシェルは、その最初の引数がゼロの文字で一つであり-、または1つは、使用を開始--loginオプション。」-lの短い形式です--login; これらは同等です。)Bashでは、実行shopt login_shellして確認することができます。
エリアケイガン

2

特に歴史の設定などの設定のためのもう一つの可能性は、HISTSIZEHISTFILESIZEHISTCONTROL、およびPS1ファイルがロードされていますが、設定は最も可能性の高い犯人がいると、後でソースで別のファイルに上書きされていることです~/.bashrc。(私たちのサーバーにはデフォルトの設定セットがあります。たとえば、rootに赤いプロンプトが表示され、ユーザーや大きな履歴にタイムスタンプが警告されます)

デフォルトのUbuntu .bashrcから/etc/skel、それはからのシステムの所有者によって設定された設定は上書きされませんどこどこから設定することは意味をなされている場合がありますセットいくつかの設定、/etc/profile.d(同様に/etc/bash.bashrc)(ユーザーが自分を編集した場合.bashrc、設定を上書きする結構です、システムのデフォルトのファイルより迷惑です)


2

Debianのターミナルセッションで、すべてのユーザーのこの問題を解決しました。

に追加

sudo nano /etc/bash.bashrc

ブロック

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

から

/etc/profile

1

このパスに従ってください:

  • 編集->設定を開きます
  • 最初のタブ「全般」のラベル「コマンド」の下で、「コマンドをログインシェルとして実行」を有効にします

-1

VERSION = "16.04.3 LTS(Xenial Xerus)"

わかりましたので、誰もがここの人がすべてのユーザーに/etc/profile.d/somefile.shを望んでいないと仮定していますが、私の場合はまさにそれが私が望んでいたことです。

したがって、Ubuntuでこれを使用し、グラフィカルシェルで有効にしたい場合は、ファイルを設定してからログアウトし、再度ログインするだけです。すべてのコンソール、またはxtermタイプまたはコンソールタイプ(またはシェルにドロップ)に関係なく起動するものはすべて、このファイルをソースにします。

すべてのユーザーに.bashrcなどを使用する必要はありません。申し訳ありませんが、上記の回答では明確ではありませんでした。彼らが言ったことはすべて真実ですが、Windowsマネージャーが起動するすべてがこれらの設定を継承するため、実際にはほとんど真実ではないので、再ログインして問題を解決し、すべてのユーザーに適用する場合は.bashrcなどを気にしないでください。


2
私の問題は、まさにこれグラフィカルユーザーインターフェースで実行されるターミナルで起こらないということです。Ubuntu 16.04.3または18.04のいずれでもありません。
トーマスアリドセン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.