/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/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

লগইন করার পরে, এটি প্রদর্শিত হয় না যে আমি তৈরি করা কাস্টম স্ক্রিপ্ট, প্রোফাইল_লোকল.শাসিত হয়ে যায়। তবে আমি যদি 'উত্স /etc.profile.d/profile_local.sh' লগইন করার পরে, আমি প্রত্যাশিত আচরণ, আমার কাস্টম উপস্ব এবং কাস্টম প্রম্পট পেতে পারি।

আমি কি ভুল করছি?

'প্রোফাইল_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
ড্র, আমার উত্তর পড়ুন। লগ-ইন শেলগুলি দ্বারা প্রোফাইল ফাইলগুলি উপেক্ষা করা হবে তবে উবুন্টুর ডিফল্ট জিইউআই লগইন সেগুলির মধ্যে কিছু পড়বে। কেবল ব্যবহার করুন .bashrcএবং আপনার সমস্ত সমস্যা দূর হবে। অগ্রাধিকারের প্রশ্নও রয়েছে, পরবর্তী সময়ে পড়া ফাইলগুলির মধ্যে যদি PS1 সেট করে তবে পূর্বের মানটি বাতিল হয়ে যায়। যাইহোক, গুরুত্ব সহকারে, ফাইলারদের সাথে স্পর্শ করবেন না /etc, আপনার বাড়ির দিরের সাথে খেলুন এবং .bashrcপ্রোফাইল ব্যবহার করবেন না।
টেরডন

1
হ্যাঁ, এটি একটি লগইন শেল হওয়া উচিত (পরের বার আপনার প্রশ্নের মধ্যে আপনার জিনিসটি অন্তর্ভুক্ত করা উচিত kind যাইহোক, বেশিরভাগ সিস্টেমে .profileআপনার বাড়িতে ডিফল্ট ফাইল থাকে এবং সেটিং এর সেটিংস আপনার যে কোনও কিছুতে ওভাররাইট করে দেয় /etc/profile। আপনি কী করছেন তা যদি না জানেন তবে মূলত কখনই স্পর্শ করবেন /etcনা। এটি ব্যবহারকারী-নির্দিষ্ট ফাইলগুলির জন্য। এছাড়াও, দয়া করে আপনার প্রশ্নটি সম্পাদনা করুন এবং ঠিক কীভাবে আপনি সংযুক্ত করছেন তা ব্যাখ্যা করুন, যা সবকিছু পরিবর্তন করে।
টেরডন

4
/etc/profile.dএটি সত্যিই খারাপ ধারণা এবং এটি ব্যবহার করে সিস্টেমের সমস্ত ব্যবহারকারীকে প্রভাবিত করে এটি করবেন না । profile_local.shআপনার থেকে কমান্ডগুলি কেবল অন্তর্ভুক্ত করুন ~/.profileবা আপনার ~/.profile: এ এই লাইনটি যুক্ত করে স্ক্রিপ্ট উত্স করুন . /path/to/profile_local.sh। (এর .অর্থ source, এটি আপনার দেওয়া ফাইলটি পড়বে এবং এটি সেখানে পাওয়া কমান্ডগুলি চালাবে)।
টেরডন

উত্তর:


108

এখানে কী চলছে তা বুঝতে, আপনাকে কীভাবে শাঁস (এই ক্ষেত্রে বাশ) চালানো হয় সে সম্পর্কে কিছুটা পটভূমি তথ্য বুঝতে হবে।

  • আপনি যখন একটি টার্মিনাল এমুলেটর খোলেন ( gnome-terminalউদাহরণস্বরূপ), আপনি একটি ইন্টারেক্টিভ, নন-লগইন শেল হিসাবে পরিচিত যা সম্পাদন করছেন ।

  • আপনি যখন কমান্ড লাইন থেকে আপনার মেশিনে লগইন করবেন sshবা কোনও কমান্ড যেমন su - usernameচালাচ্ছেন, আপনি একটি ইন্টারেক্টিভ লগইন শেল চালাচ্ছেন ।

  • আপনি যখন গ্রাফিকালি লগ ইন করবেন, আপনি সম্পূর্ণ আলাদা কিছু চালাচ্ছেন, বিশদগুলি আপনার সিস্টেম এবং গ্রাফিকাল পরিবেশের উপর নির্ভর করবে তবে সাধারণভাবে এটি গ্রাফিকাল শেল যা আপনার লগইন নিয়ে কাজ করে। যদিও অনেকগুলি গ্রাফিকাল শেল (উবুন্টু ডিফল্ট সহ) /etc/profileসমস্তই পড়বে না।

  • অবশেষে, আপনি যখন শেল স্ক্রিপ্টটি চালাবেন, এটি একটি অ-ইন্টারেক্টিভ, অ-লগইন শেলটিতে চালিত হবে ।

এখন, ব্যাশ করা ফাইলগুলি যখন চালু হবে তখন এটি যে ধরণের শেল চলছে তার উপর নির্ভর করে। নিম্নলিখিতটি man bash(জোর দেওয়া খনি) এর ইনভোকেশন বিভাগের একটি অংশ রয়েছে :

যখন বাশকে একটি ইন্টারেক্টিভ লগইন শেল হিসাবে, বা - লগিন বিকল্পের সাথে একটি অ-ইন্টারেক্টিভ শেল হিসাবে ডাকা হয়, এটি প্রথমে ফাইল / ইত্যাদি / প্রোফাইল থেকে কমান্ডগুলি পড়ে এবং কার্যকর করে , যদি সেই ফাইলটি বিদ্যমান থাকে। এই ফাইলটি পড়ার পরে, এটি সেই ক্রমে ash / .bash_profile, ~ / .bash_login, এবং ~ / । প্রোফাইলে অনুসন্ধান করে এবং উপস্থিত এবং পঠনযোগ্য যা প্রথমটি থেকে আদেশগুলি পড়ে এবং কার্যকর করে। শেলটি এই আচরণটি বাধা দিতে শুরু করা হলে --noprofile বিকল্পটি ব্যবহার করা যেতে পারে।

লগইন শেল নয় এমন একটি ইন্টারেক্টিভ শেলটি শুরু করা হলে, বাশ /etc/bash.bashrc এবং ~ / .bashrc থেকে কমান্ডগুলি পড়ে এবং কার্যকর করে , যদি এই ফাইলগুলি উপস্থিত থাকে। এটি --norc বিকল্প ব্যবহার করে বাধা দেওয়া হতে পারে। --Rcfile ফাইল অপশনটি বাশকে /etc/bash.bashrc এবং ~ / .bashrc এর পরিবর্তে ফাইল থেকে আদেশগুলি পড়তে এবং সম্পাদন করতে বাধ্য করবে।

এর সবকিছুর অর্থ হ'ল আপনি ভুল ফাইলটি সম্পাদনা করছেন। আপনি একটি ভার্চুয়াল কনসোল ব্যবহার করে ড্রপের দ্বারা এই পরীক্ষা করতে পারেন Ctrl+ + Alt+ + F2(সঙ্গে গুই ফিরে Alt+ + F7, বা F8আপনার সেটআপ উপর নির্ভর করে) এবং সেখানে লগ-ইন। আপনি দেখতে পাবেন যে আপনার প্রম্পট এবং উপকরণগুলি উপলব্ধ।

সুতরাং, নন-লগইন শেলগুলিতে আপনি যে সেটিংটি প্রয়োগ করতে চান সেটির জন্য, প্রতিবার আপনি টার্মিনালটি খোলার সময় আপনি যে ধরণের পান, তার ~/.bashrcপরিবর্তে আপনার পরিবর্তন করা উচিত । বিকল্পভাবে, আপনি নিজের এলিয়াসগুলি ফাইলটিতেও রাখতে পারেন ~/.bash_aliases(তবে নোট করুন এটি একটি উবুন্টু বৈশিষ্ট্য এবং এটি অন্যান্য বিতরণে কাজ করার আশা করা উচিত নয়)।

কোন ফাইলটি কোনটির জন্য ব্যবহার করা উচিত সে সম্পর্কে আরও তথ্যের জন্য এখানে দেখুন


নোট:

  • ডেবিয়ান (এবং এক্সটেনশন উবুন্টু) এর ডিফল্ট ~/.profileউত্সও রয়েছে ~/.bashrc। এর অর্থ হ'ল যে কোনও পরিবর্তন আপনি ~/.bashrcলগইন শেল দ্বারা উত্তরাধিকার সূত্রে প্রাপ্ত হবে তবে i) সমস্ত লিনাক্স / ইউনিক্স মেশিনে এটি হয় না এবং ii) বিপরীতটি সত্য নয় যে কারণে আপনাকে সাধারণত সর্বদা ~/.bashrc& Co এর পরিবর্তে বরং কাজ করা উচিত ~/.profileবা /etc/profile

  • এছাড়াও, ব্যবহার সম্পর্কে একটি সাধারণ নোট, কনফিগারেশন ফাইলগুলিতে করা পরিবর্তনগুলি সমস্ত ব্যবহারকারীকে /etcপ্রভাবিত করবে । এটি সাধারণত আপনি যা করতে চান তা নয় এবং এড়ানো উচিত। আপনার সর্বদা আপনার হোম ডিরেক্টরিতে ( ) ডিরেক্টরিতে সমতুল্য ফাইলগুলি ব্যবহার করা উচিত ।~/

  • বিভিন্ন কনফিগারেশন ফাইল ক্রমানুসারে পড়া হয়। বিশেষত, লগইন শেলগুলির জন্য, অর্ডারটি হ'ল:

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

    এর অর্থ হ'ল যে কোনও সেটিং ~/.profileপূর্ববর্তী ফাইলগুলিতে সেট থাকা যে কোনও কিছুকে ওভাররাইট করে।


1
এই পোস্টের অনুসারে howtolamp.com/articles/… অনুসারে , আপনি echo $0টার্মিনাল থেকেও চালাতে পারেন এবং যদি আউটপুটটিকে "-" দিয়ে উপস্থাপন করা হয় তবে আপনি লগইন শেলটিতে রয়েছেন।
স্ট্যাকওভার ফ্লাওয়ার 22'15

@stackoverflower আমার সিস্টেমে নেই। এটি একটি দূরবর্তী, ইন্টারেক্টিভ লগইন শেলের জন্য কাজ করে। দৌড়ানোর সময় মনে হয় না bash -l। যে কোনও ক্ষেত্রে, কেন এটি প্রাসঙ্গিক? আপনি কী ধরণের শেল চালাচ্ছেন তা কীভাবে পরীক্ষা করবেন তা প্রশ্ন নয়।
টেরডন

magnificant পোস্ট, ভাবছি কেন এটি আপ Google এ যখন আমি একই সমস্যা ছিল হয়নি
Donato

@ স্ট্যাকওভারফ্লাওয়ার যদি "$0"এমন কিছুতে প্রসারিত হয় যা দিয়ে শুরু হয় -, তবে আপনি জানেন যে আপনার একটি লগইন শেল রয়েছে। তবে কথোপকথনটি সত্য নয়: অনুপস্থিতি -নিশ্চিত করে না যে আপনি লগইন শেলটিতে নেই। লগইন শেলগুলি শুরু করার সর্বাধিক সাধারণ উপায়গুলি আপনাকে একটি শীর্ষস্থানীয় দেয় -তবে সমস্তটি নয়। man bashআমাদের বলুন "একটি লগইন শেল এমন একটি যার আর্গুমেন্টের প্রথম অক্ষর a -, বা একটি --loginবিকল্প দিয়ে শুরু হয়েছিল " " ( -lএর সংক্ষিপ্ত রূপ --login; এগুলি সমতুল্য )) বাশে আপনি shopt login_shellযাচাই করতে দৌড়াতে পারেন।
এলিয়াহ কাগন 21

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 এলটিএস (জেনিয়াল জেরাস)"

ঠিক আছে তাই প্রত্যেকে ধরে নিয়েছে যে এখানকার ব্যক্তিটি সমস্ত ব্যবহারকারীর জন্য /etc/profile.d/somefile.sh চায় না, তবে আমার ক্ষেত্রে ঠিক আমি যা চেয়েছিলাম ঠিক তেমনটাই চাই।

সুতরাং এটি যেমন উবুন্টুর সাথে দেখা যাচ্ছে আপনি যদি এটি ব্যবহার করেন এবং আপনি এটি আপনার গ্রাফিকাল শেলটিতে কার্যকর করতে চান, আপনাকে যা করতে হবে তা ফাইল সেট করে এবং তারপরে লগআউট এবং আবার ফিরে আসবে। আপনার সমস্ত কনসোল বা যে কোনও কিছু আপনি প্রবর্তন করুন এটি এক্সটার্ম টাইপ বা কনসোল প্রকারের (বা শেল ছেড়ে যাওয়া) এখন সেই ফাইলটি স্রোসযুক্ত হবে।

সমস্ত ব্যবহারকারীর জন্য .bashrc ইত্যাদি ব্যবহার করার দরকার নেই। দুঃখিত, এটি কেবল উপরের উত্তরে পরিষ্কার ছিল না। তারা যা বলেছিল তা সবই সত্য তবে বাস্তবে এটি সত্য নয় কারণ উইন্ডোজ ম্যানেজার যে সমস্ত কিছু চালু করে সেগুলি এই সেটিংসের উত্তরাধিকারী হবে তাই কেবল পুনরায় লগইন করুন এবং আপনার সমস্যাটি সমাধান করুন এবং আপনার ব্যবহারকারীরা যদি এটি প্রয়োগ করতে চান তবে .brcrc ইত্যাদি নিয়ে বিরক্ত করবেন না if ।


2
আমার সমস্যা হলো এই ঠিক নেই গ্রাফিকাল ইউজার ইন্টারফেস অধীনে চালানো টার্মিনাল ঘটতে; উবুন্টু 16.04.3 বা 18.04 এ নয়।
থমাস আরিল্ডসেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.