/etc/profile.d의 스크립트는 무시됩니까?


61

우분투를 처음 사용합니다. 13.10 Desktop을 실행 중입니다.

시스템 전체 별명과 bash에 대한 사용자 정의 프롬프트를 설정하고 싶었습니다. 이 기사를 찾았습니다.

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

이 기사의 조언에 따라 /etc/profiles.d/profile_local.sh를 작성했습니다. 루트가 소유하고 있으며 다른 스크립트와 마찬가지로 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가 소스로 표시되지 않습니다. 그러나 로그인 후 'source /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
아니요, 실행 파일은 아니지만 다른 두 스크립트도 아닙니다. 그러나 나는 그것을 바꾸고 다시 시도했다. 아직 운이 없다.
Drew

3
이것은 추가와 관련이 없으며 관련이 없으며 .sh어쨌든 파일 profile.d은 소스가 아니며 실행되지 않으며 약간 다르며 파일을 실행할 필요가 없습니다. 여기서 문제는 profile로그인하지 않은 스크립트가 & co를 읽지 않는다는 것입니다.
terdon

1
드류, 내 대답을 읽어 비 로그인 쉘은 프로파일 파일을 무시하지만 Ubuntu의 기본 GUI 로그인은 그 중 일부를 읽습니다. 그냥 사용하면 .bashrc모든 문제가 사라질 것입니다. 또한 나중에 읽은 파일 중 하나가 PS1을 설정하면 우선 순위에 대한 의문이 생깁니다. 그러면 이전 값이 삭제됩니다. 어쨌든,의 파일러를 만지지 말고 /etc, 홈 디렉토리 의 파일러 와 함께 플레이하고 .bashrc프로필을 사용 하지 마십시오.
terdon

1
예, 로그인 쉘이어야합니다 (다음에 질문에 포함해야하는 경우). 그러나 대부분의 시스템에는 .profile가정에 기본 파일이 있으며 설정은에서 수행 한 모든 작업을 덮어 씁니다 /etc/profile. 무엇을하고 있는지 알지 못한다면 기본적으로 만지지 마십시오/etc . 이것이 바로 사용자 별 파일입니다. 또한 질문을 편집 하고 연결 방법을 정확하게 설명하면 모든 것이 바뀝니다.
terdon

4
이 방법 /etc/profile.d을 사용 하면 정말 나쁜 생각이며 시스템의 모든 사용자에게 영향을 미칩니다. 에서 그냥 명령을 포함 profile_local.sh당신의 ~/.profile당신이 줄을 추가하여 스크립트를 소스하거나 ~/.profile: . /path/to/profile_local.sh. 합니다 ( .수단 source, 당신이 그것을 줄 파일을 읽고이 발견 명령을 실행한다).
terdon

답변:


108

여기서 무슨 일이 일어나고 있는지 이해하려면, 쉘 (이 경우에는 bash)이 어떻게 실행되는지에 대한 약간의 배경 정보를 이해해야합니다.

  • gnome-terminal예를 들어 터미널 에뮬레이터를 열면 대화 형 비 로그인 셸이 실행됩니다.

  • 명령 줄에서을 통해 컴퓨터에 로그인 하거나과 ssh같은 명령 su - username을 실행하면 대화식 로그인 셸 이 실행 됩니다.

  • 그래픽으로 로그인 할 때 완전히 다른 것을 실행하는 경우 세부 사항은 시스템 및 그래픽 환경에 따라 다르지만 일반적으로 로그인을 처리하는 것은 그래픽 쉘 입니다. 많은 그래픽 셸 (우분투 기본값 포함)은 /etc/profile모든 그래픽 셸을 읽지는 않습니다.

  • 마지막으로, 쉘 스크립트를 실행할 때 비 대화식, 비 로그인 쉘에서 실행 됩니다.

이제 bash가 시작할 때 읽는 파일은 실행중인 쉘의 유형에 따라 다릅니다. 다음은 man bash(강조 광산) 의 INVOCATION 섹션에서 발췌 한 것입니다 .

bash가 대화식 로그인 쉘 또는 --login 옵션을 사용하는 비 대화식 쉘로 호출 되면 파일이 존재하는 경우 먼저 / 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)에도 기본 ~/.profile소스가 ~/.bashrc있습니다. 이 변경 사항은 당신이 할 수 있도록한다는 것을 의미 ~/.bashrc또한 로그인 쉘에 의해 상속됩니다하지만 난)이 모든 리눅스 / 유닉스 시스템의 경우가 아니라, Ⅱ) 역 당신이 일반적으로 항상 작동해야하는 이유 인 사실이 아니다 ~/.bashrc보다는 및 공동 ~/.profile또는 /etc/profile.

  • 또한 사용에 대한 일반적인 참고 사항, 구성 파일의 변경 사항은 모든 사용자에게 /etc영향을 미칩니다 . 이것은 일반적으로 수행하려는 작업이 아니며 피해야합니다. 항상 홈 디렉토리 ( ) 에서 동등한 파일을 사용해야합니다 .~/

  • 다양한 구성 파일을 순차적으로 읽습니다. 특히 로그인 쉘의 순서는 다음과 같습니다.

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

    즉, 설정 ~/.profile하면 이전 파일에 설정된 내용을 덮어 씁니다.


1
이 게시물 howtolamp.com/articles/… 에 따르면 echo $0터미널 에서도 실행할 수 있으며 출력 앞에 "-"가 붙으면 로그인 쉘에있는 것입니다.
stackoverflower

내 시스템에 @stackoverflower가 없습니다. 원격 대화식 로그인 셸에서 작동합니다. 실행할 때 보이지 않는 것 같습니다 bash -l. 어쨌든 왜 관련이 있습니까? 질문은 실행중인 쉘 유형을 확인하는 방법에 관한 것이 아닙니다.
terdon

웅장한 게시물, 왜 같은 문제가 발생했을 때 Google에 표시되지 않았는지 궁금합니다
Donato

@stackoverflower로 "$0"시작하는 것으로 확장 -하면 로그인 쉘이있는 것입니다. 그러나 그 반대는 사실이 아닙니다. 부재 -하더라도 로그인 쉘 에 있지 않다는 보장은 없습니다. 로그인 쉘을 시작하는 가장 일반적인 방법은 -전부는 아니지만 선도적 입니다. man bash우리에게 "A 로그인 쉘은 하나의 그 첫 번째 문자 인수가 제로가이다 -, 또는 하나는 시작 --login옵션을 선택합니다." ( -l의 짧은 형식입니다 --login; 그것들은 동등 합니다.) Bash에서 당신은 shopt login_shell검사를 실행할 수 있습니다.
Eliah Kagan

2

특히 기록 설정과 같은 설정에 대한 또 다른 가능성은, HISTSIZE, HISTFILESIZE, HISTCONTROL, 및 PS1파일이로드되고 있지만 설정이 가장 가능성이 범인 인 상태, 나중에 소스 다른 파일에 덮어 쓰기 때문이다 ~/.bashrc. (타임 스탬프를 사용하여 사용자와 큰 기록을 경고하기 위해 루트에 빨간색으로 표시되는 프롬프트와 같이 서버에 대한 기본 설정 세트가 있습니다)

기본 우분투 .bashrc에서 /etc/skel그것을에서 시스템 소유자가 설정 설정을 무시하지 않을 곳으로부터 설정하는 것이 만든 수있는 세트 여러 가지 설정, /etc/profile.d(마찬가지로를 /etc/bash.bashrc) (사용자가 자신을 편집하는 경우 .bashrc, 설정, 시스템 기본 파일을 덮어 쓸 괜찮습니다 더 성가신)


2

터미널 세션 용 데비안에서 모든 사용자에 대해이 문제를 해결했습니다.

에 추가

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 (제니 얼 제르 우스)"

좋아, 모든 사람은 여기있는 사람이 모든 사용자에게 /etc/profile.d/somefile.sh를 원하지 않는다고 가정했지만 내 경우에는 정확히 내가 원했던 것입니다.

실제로 이것을 사용하고 그래픽 쉘에서 적용하려면 Ubuntu에서 밝혀 지듯이 파일을 설정 한 다음 로그 아웃하고 다시 로그인하면됩니다. 모든 콘솔 또는 xterm 유형이든 콘솔 유형이든 (또는 셸에 놓아 두었 든) 실행 한 모든 파일은 이제 해당 파일을 소스로 갖습니다.

모든 사용자에게 .bashrc 등을 사용할 필요가 없습니다. 죄송합니다. 위의 답변에서 명확하지 않았습니다. 그들이 말한 모든 것이 사실이지만 실제로는 Windows 관리자가 시작하는 모든 것이 이러한 설정을 상속하므로 다시 로그인하고 문제를 해결하고 모든 사용자에게 적용하려는 경우 .bashrc 등으로 귀찮게하지 않기 때문에 대부분 사실이 아닙니다. .


2
내 문제는 정확히 그래픽 사용자 인터페이스에서 터미널 실행에서 발생 하지 않는다는 것입니다. 우분투 16.04.3 또는 18.04에는 없습니다.
Thomas Arildsen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.