Сценарії в /etc/profile.d Ігноруються?


61

Я новачок у Ubuntu. Я працюю 13.10 Desktop.

Я хотів встановити деякі системні псевдоніми та власну підказку для 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, який я створив, отримує джерело. Однак якщо після входу я '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
Ні, це не виконується, але й інші два сценарії не є. Однак я змінив його і спробував ще раз. Ще не везе.
Дрю

3
Це не має нічого спільного з додаванням .sh, це не має ніякого значення, і все одно файли в них profile.dстворюються, а не виконуються, що дещо відрізняється і не вимагає виконання файлу. Проблема тут полягає в тому, що profile& co не читаються сценаріями без входу.
тердон

1
Дрю, прочитай мою відповідь. Файли профілів ігноруються оболонками, які не входять в систему, але деякі з них прочитають графічний інтерфейс Ubuntu за замовчуванням. Просто використовуйте, .bashrcі всі ваші проблеми зникнуть. Існує також питання пріоритетності, якщо один з файлів, які згодом читаються, також встановлює PS1, то попереднє значення буде відкинуто. У будь-якому разі, якщо серйозно, не торкайтеся файлерів /etc, грайте з тими, хто знаходиться у вашому домашньому режисері, і .bashrcне використовуйте профіль.
тердон

1
Так, це повинна бути оболонка для входу (саме такий варіант, якщо ви повинні наступного разу включити своє запитання). Однак у більшості систем .profileу вашому домі є файли за замовчуванням, і там налаштування замінять все, що ви робите /etc/profile. В основному ніколи не торкайтеся, /etcякщо ви не знаєте, що робите. Саме для цього призначені файли, призначені для користувача. Крім того, відредагуйте своє запитання та поясніть, як саме ви підключаєтесь, що все змінює.
terdon

4
Будь ласка, не робіть цього, використовуючи /etc/profile.dце дуже погану ідею, і це вплине на всіх користувачів системи. Просто включите команди з profile_local.shв вашому ~/.profileабо просто джерело сценарій, додавши наступний рядок в ~/.profile: . /path/to/profile_local.sh. ( .значить source, він прочитає файл, який ви йому надаєте, і виконає команди, які він там знайде).
terdon

Відповіді:


108

Щоб зрозуміти, що тут відбувається, вам потрібно розібратися з невеликою довідковою інформацією про те, як запускаються снаряди (в даному випадку бош).

  • Відкриваючи емулятор терміналу ( gnome-terminalнаприклад), ви виконуєте те, що відомо як інтерактивна оболонка без входу .

  • Коли ви входите в свою машину з командного рядка, через sshабо запускаєте таку команду, як su - username, ви запускаєте інтерактивну оболонку входу .

  • Коли ви входите у графічний спосіб, ви запускаєте щось зовсім інше, деталі залежатимуть від вашої системи та графічного середовища, але загалом графічна оболонка стосується вашого входу. Хоча багато графічних оболонок (включаючи Ubuntu за замовчуванням) будуть читати /etc/profileне всі з них.

  • Нарешті, коли ви запускаєте скрипт оболонки, він запускається в неінтерактивній оболонці без входу .

Тепер файли, які bash буде читати при запуску, залежать від типу оболонки, на якій він працює. Далі - уривок розділу ІНВОКАЦІЯ man bash(акцент міна):

Коли 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, і не слід очікувати, що вона буде працювати на інших дистрибутивах).

Детальніше про те, який файл слід використовувати для чого, дивіться тут .


ПРИМІТКИ:

  • Debian (і розширення Ubuntu) також має ~/.profileджерело за замовчуванням ~/.bashrc. Це означає, що будь-які зміни, які ви вносите ~/.bashrc, також будуть успадковані оболонками входу, але i) це не так у всіх 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, коли у мене була така ж проблема
Donato

@stackoverflower Якщо "$0"поширюється на щось, що починається з -, знаєте, що у вас є оболонка для входу. Але зворотне не вірно: відсутність -не гарантує, що ви не в оболонці входу. Найбільш поширені способи запуску оболонок для входу дають вам провідну роль -, але не всі. man bashговорить нам: " Оболонка входу - це той, чий перший символ аргументу нульовий - a -, або той, що розпочався з --loginпараметра." ( -lце коротка форма --login; вони еквівалентні .) На Bash ви можете бігти, shopt login_shellщоб перевірити.
Елія Каган

2

Ще одна можливість, особливо для настройки , такі як налаштування історії HISTSIZE, HISTFILESIZE, HISTCONTROLі PS1в тому , що файли завантажуються, але настройки будуть переписані в іншому файлі , який є джерелом пізніше, з найбільш імовірним винуватцем є ~/.bashrc. (У мене є набір параметрів для наших серверів за замовчуванням, як-от червоний для кореневого сповіщення для попередження користувача та великих історій із позначками часу)

За замовчуванням Ubuntu .bashrcз /etc/skelнаборів декількох установок, які могли б мати сенс встановити звідки - то , де вона не переважають налаштувань , встановлені власником системи з /etc/profile.d(Like /etc/bash.bashrc) (Якщо користувач редагує їх .bashrc, це прекрасно , щоб переписати настройки, файли системи по замовчуванням більше дратують)


2

в сесії Debian for Terminal я вирішив цю проблему для всіх користувачів так:

додано до

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.
Thomas Arildsen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.