/Etc/profile.d में अनदेखा किया जा रहा है?


61

मैं उबंटू में नया हूं। मैं 13.10 डेस्कटॉप चला रहा हूं।

मैं कुछ सिस्टम वाइड एलियास और बैश के लिए एक कस्टम प्रॉम्प्ट सेट करना चाहता था। मुझे यह लेख मिला:

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 / प्रोफाइल कॉल /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 बनाई है वह खट्टी हो जाती है। हालाँकि अगर लॉगिन I 'स्रोत /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गैर-लॉग स्क्रिप्ट्स द्वारा सह & पढ़े नहीं जाते हैं।
terdon

1
आकर्षित किया, मेरा जवाब पढ़ा। प्रोफ़ाइल फ़ाइलों को गैर-लॉगिन शेल द्वारा अनदेखा किया जाता है, लेकिन उबंटू का डिफ़ॉल्ट 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

यह समझने के लिए कि यहां क्या हो रहा है, आपको इस बारे में थोड़ी पृष्ठभूमि की जानकारी समझने की जरूरत है कि इस मामले में गोले (बैश) कैसे चलते हैं।

  • जब आप एक टर्मिनल एमुलेटर खोलते हैं ( gnome-terminalउदाहरण के लिए), तो आप निष्पादित कर रहे हैं जिसे एक इंटरैक्टिव, गैर-लॉगिन शेल के रूप में जाना जाता है ।

  • जब आप कमांड लाइन से अपनी मशीन में लॉग इन करते हैं, तो sshजैसे या कमांड चलाते su - usernameहैं, आप एक इंटरेक्टिव लॉगिन शेल चला रहे हैं ।

  • जब आप ग्राफ़िकल रूप से लॉग इन करते हैं, तो आप कुछ पूरी तरह से अलग चल रहे हैं, विवरण आपके सिस्टम और चित्रमय वातावरण पर निर्भर करेगा लेकिन सामान्य तौर पर यह ग्राफ़िकल शेल है जो आपके लॉगिन से संबंधित है। जबकि कई ग्राफिकल गोले (उबंटू डिफ़ॉल्ट सहित) /etc/profileउन सभी को नहीं पढ़ेंगे ।

  • अंत में, जब आप एक शेल स्क्रिप्ट चलाते हैं, तो यह एक गैर-इंटरैक्टिव, गैर-लॉगिन शेल में चलाया जाता है ।

अब, लॉन्च होने पर जो फाइलें टकराएंगी, वे उस प्रकार के शेल पर निर्भर करती हैं, जिस पर वह चल रही है। निम्नलिखित man bash(इस पर जोर) खंड के निवेश का एक अंश है :

जब बैश को एक इंटरेक्टिव लॉगिन शेल के रूप में या एक गैर-इंटरेक्टिव शेल के रूप में - एल्गिन विकल्प के रूप में लागू किया जाता है , तो यह पहले फ़ाइल / आदि / प्रोफाइल से कमांड को पढ़ता है और निष्पादित करता है , यदि वह फ़ाइल मौजूद है। उस फ़ाइल को पढ़ने के बाद, यह उस क्रम में ~ / .bash_profile, ~ / .bash_login और ~ / .profile की तलाश करता है, और पहले मौजूद से कमांड पढ़ता और निष्पादित करता है और पढ़ने योग्य होता है। जब इस व्यवहार को रोकने के लिए शेल शुरू किया जाता है - तो नोप्रोफाइल विकल्प का उपयोग किया जा सकता है।

जब एक इंटरेक्टिव शेल जो लॉगिन शेल नहीं है, तो bash पढ़ता है और /etc/bash.bashrc और ~ / .bashrc से कमांड निष्पादित करता है , अगर ये फाइलें मौजूद हैं। यह --norc विकल्प के उपयोग से बाधित हो सकता है। --Rcfile फ़ाइल विकल्प bet को /etc/bash.bashrc और ~ / .bashrc के बजाय फ़ाइल से कमांड को पढ़ने और निष्पादित करने के लिए बाध्य करेगा।

यह सब क्या मतलब है कि आप गलत फ़ाइल को संपादित कर रहे हैं। आप एक आभासी कंसोल का उपयोग करने के लिए छोड़ने के द्वारा इस परीक्षण कर सकते हैं Ctrl+ Alt+ F2(साथ जीयूआई के लिए वापसी Alt+ F7, या F8अपने सेटअप के आधार पर) और वहाँ में प्रवेश करने। आप देखेंगे कि आपका संकेत और उपनाम उपलब्ध हैं।

अतः, आप जो सेटिंग चाहते हैं, उसे नॉन-लॉगिन शेल पर लागू करने के लिए, हर बार जब आप टर्मिनल खोलते हैं, तो आपको ~/.bashrcइसके बजाय अपने बदलाव करने चाहिए। वैकल्पिक रूप से, आप अपने उपनामों को फ़ाइल में रख सकते हैं ~/.bash_aliases(हालांकि, ध्यान दें कि यह एक उबंटू विशेषता है और आपको इसे अन्य वितरण पर काम करने की उम्मीद नहीं करनी चाहिए)।

अधिक जानकारी के लिए किस फ़ाइल का उपयोग किस लिए किया जाना चाहिए, यहां देखें ।


टिप्पणियाँ:

  • डेबियन (और एक्सटेंशन उबंटू द्वारा) भी डिफ़ॉल्ट ~/.profileस्रोत है ~/.bashrc। इसका मतलब यह है कि आपके द्वारा किए गए कोई भी परिवर्तन ~/.bashrcभी लॉगिन गोले द्वारा विरासत में मिले होंगे, लेकिन i) सभी लिनक्स / यूनिक्स मशीनों और ii में ऐसा नहीं है। उलटा सच नहीं है, यही कारण है कि आपको आम तौर पर ~/.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

शानदार पोस्ट, आश्चर्य है कि जब मैं एक ही समस्या थी तो यह गूगल पर क्यों नहीं दिखा
डोनैटो

@stackoverflower यदि "$0"किसी ऐसी चीज़ का विस्तार होता है जिसके साथ शुरू होता है -, तो आप जानते हैं कि आपके पास एक लॉगिन शेल है। लेकिन यह विश्वास सच नहीं है: अनुपस्थिति -यह सुनिश्चित नहीं करती है कि आप लॉगिन शेल में नहीं हैं। लॉगिन गोले शुरू करने के सबसे आम तरीके आपको एक अग्रणी देते हैं -, लेकिन सभी नहीं। man bashहमें बताता है "एक लॉगिन शेल वह है जिसका तर्क शून्य का पहला चरित्र है -, या एक --loginविकल्प के साथ शुरू हुआ है ।" ( -lसंक्षिप्त रूप है --login; वे समतुल्य हैं ।) बैश में आप shopt login_shellजांच के लिए दौड़ सकते हैं ।
एलियाह कगन

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

संस्करण = "16.04.3 LTS (ज़ेनियल ज़ेरुस)"

ठीक है, इसलिए सभी ने मान लिया है कि यहाँ व्यक्ति सभी उपयोगकर्ताओं के लिए /etc/profile.d/somefile.sh नहीं चाहता है, लेकिन मेरे मामले में वही है जो मैं चाहता था।

तो वास्तव में जैसा कि यह उबंटू के साथ बाहर निकलता है यदि आप इसका उपयोग करते हैं और आप चाहते हैं कि यह आपके चित्रमय शेल में प्रभावी हो, तो आपको बस फ़ाइल को सेट करना होगा और फिर लॉगआउट और फिर से वापस करना होगा। आपके सभी कंसोल या कुछ भी जो आप लॉन्च करते हैं चाहे वह xterm टाइप हो या कंसोल टाइप (या शेल को छोड़ना) अब आपके पास खट्टा हो जाएगा।

सभी उपयोगकर्ताओं के लिए .bashrc आदि का उपयोग करने की आवश्यकता नहीं है। क्षमा करें, यह उपरोक्त उत्तर में स्पष्ट नहीं था। उन्होंने जो कुछ भी कहा वह सच है लेकिन वास्तव में इसका ज्यादातर सच नहीं है क्योंकि विंडोज मैनेजर द्वारा लॉन्च की गई हर चीज इन सेटिंग्स को इनहेरिट करेगी ताकि आपके लॉगिन को हल किया जा सके और .bashrc आदि से परेशान न हों यदि आपका इरादा इसे सभी उपयोगकर्ताओं पर लागू करना है। ।


2
मेरी समस्या ठीक यही है कि ग्राफ़िकल यूज़र इंटरफ़ेस के तहत टर्मिनल रन में ऐसा नहीं होता है; न तो उबंटू में 16.04.3 या 18.04 में।
थॉमस अरिल्डसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.