/Etc/profile.d içindeki scriptler yoksayılıyor mu?


61

Ubuntu'da yeniyim. 13.10 Masaüstü çalıştırıyorum.

Bazı sistem geniş takma adları ve bash için özel bir komut istemi yapmak istedim. Bu makaleyi buldum:

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

Bu makaledeki tavsiyelerin ardından /etc/profiles.d/profile_local.sh dosyasını oluşturdum. Köklere aittir ve diğer komut dosyalarında olduğu gibi 644'ün izinlerine sahiptir:

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

Ayrıca / etc / profile'nin /etc/profile.d 'i çağırdığını da onayladım. Bu kod bloğunu içerir:

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

Giriş yaptıktan sonra, yarattığım profile_local.sh özel betiğinin kaynaklandığı görülüyor. Ancak giriş yaptıktan sonra 'kaynak /etc.profile.d/profile_local.sh' varsa, beklenen davranışı, özel takma adımı ve özel istemi alırım.

Neyi yanlış yapıyorum?

'Profile_local.sh' betiğinin içeriği:

# 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
Hayır, çalıştırılabilir değil ancak diğer iki komut dosyası da değil. Ancak değiştirdim ve tekrar denedim. Hala şans yok.
Drew

3
Bunun ekleme .shile ilgisi yoktur, ilgisizdir ve yine de içerdiği dosyalar profile.dyürütülür, yürütülemez, ki bunlar biraz farklıdır ve dosyanın çalıştırılabilir olmasını gerektirmez. Buradaki sorun, profile& co'nun giriş yapmayan komut dosyaları tarafından okunmamasıdır.
terdon

1
Drew, cevabımı oku. Profil dosyaları, giriş yapmayan kabuklar tarafından yoksayılır, ancak Ubuntu'nun varsayılan GUI giriş bilgileri bir kısmını okuyacaktır. Sadece kullan .bashrcve tüm problemlerin gider. Daha sonra okunan dosyalardan biri de PS1'i ayarlarsa, bir öncelik sorusu vardır, o zaman önceki değer atılır. Her neyse, cidden, dosyalara dokunma, /etcevinde oynadıklarınla ​​oyna ve .bashrcprofil kullanma .
terdon

1
Evet, bu bir giriş kabuğu olmalıdır (bir dahaki sefere sorunuza eklemeniz gereken şey bu tür). Ancak, çoğu sistem .profileevinizde varsayılan dosyalara sahiptir ve buradaki ayarlar yaptığınız herhangi bir şeyin üzerine yazacaktır /etc/profile. Ne yaptığınızı bilmiyorsanız, temelde asla dokunmayın /etc. Kullanıcıya özel dosyalar bunun içindir. Ayrıca, lütfen sorunuzu düzenleyin ve tam olarak nasıl bağlandığınızı açıklayın, bu her şeyi değiştirir.
terdon

4
Lütfen bunu kullanmayın /etc/profile.d, bu gerçekten kötü bir fikirdir ve sistemin tüm kullanıcılarını etkileyecektir. Sadece komutları içerir profile_local.shGözlerinde farklı ~/.profileadresinden Müşteri bu satır ekleyerek senaryoyu kaynak veya basitçe ~/.profile: . /path/to/profile_local.sh. ( .vasıta source, bunu verin dosyasını okuyabilir ve orada bulduğu komutları çalıştırır).
terdon

Yanıtlar:


109

Burada neler olup bittiğini anlamak için, mermilerin (bu durumda bash) nasıl çalıştırıldığı hakkında biraz arka plan bilgisini anlamanız gerekir.

  • Bir terminal emülatörü açtığınızda ( gnome-terminalörneğin), etkileşimli, giriş yapmayan bir kabuk olarak bilinen şeyi yürütüyorsunuz .

  • Makinenize komut satırından giriş yaptığınızda sshveya komutunu su - usernameçalıştırdığınızda, bir etkileşimli giriş kabuğu çalıştırıyorsunuzdur .

  • Grafik olarak giriş yaptığınızda, tamamen farklı bir şey çalıştırıyorsunuzdur, ayrıntılar sisteminize ve grafik ortamınıza bağlı olacaktır, ancak genel olarak giriş bilgilerinizle ilgilenen grafik kabuğu vardır. Pek çok grafik kabuğu (varsayılan Ubuntu dahil) /etc/profilehepsini okumaz .

  • Son olarak, bir kabuk betiğini çalıştırdığınızda, etkileşimli olmayan, giriş yapmayan bir kabukta çalıştırılır .

Şimdi, bash'ın başlatıldığında okuyacağı dosyalar, çalıştığı kabuğun türüne bağlıdır. Aşağıdaki man bash( VAYIR madeninin) İNCELEME bölümünün bir kısmıdır :

Bash etkileşimli bir giriş kabuğu olarak veya --login seçeneğiyle etkileşimli olmayan bir kabuk olarak çağrıldığında , önce bu dosya varsa / etc / profile dosyasındaki komutları okur ve yürütür . Bu dosyayı okuduktan sonra, bu sırada ~ / .bash_profile, ~ / .bash_login ve ~ / .profile ifadelerini arar ve var olan ve okunabilen ilk komuttan komutları okur ve yürütür. --Noprofile seçeneği, kabuk bu davranışı engellemeye başladığında kullanılabilir.

Bir zaman interaktif kabuk olan bir giriş kabuğu değil başlatıldığında, bash okur ve komutlarını çalıştırır /etc/bash.bashrc ve ~ / .bashrc bu dosyalar varsa,. Bu --norc seçeneği kullanılarak engellenebilir. --Rcfile dosya seçeneği bash'yi /etc/bash.bashrc ve ~ / .bashrc yerine dosyadan komutları okumaya ve yürütmeye zorlar.

Bütün bunların anlamı, yanlış dosyayı düzenliyor olmanız. Sen kullanarak sanal bir konsola bırakarak bu test edebilirsiniz Ctrl+ Alt+ F2(ile GUI dönüş Alt+ F7veya F8ayarlarınıza bağlı olarak) ve orada giriş. İsteğinizin ve takma adların kullanılabilir olduğunu göreceksiniz.

Bu nedenle, oturum açmayan kabuklara istediğiniz ayarı uygulamak için, bir terminali her açtığınızda aldığınız tür, ~/.bashrcbunun yerine değişiklik yapmalısınız . Alternatif olarak, takma adlarınızı dosyaya da yerleştirebilirsiniz ~/.bash_aliases(bunun bunun bir Ubuntu özelliği olduğunu ve diğer dağıtımlarda çalışmasını beklememeniz gerektiğini unutmayın).

Hangi dosyanın ne için kullanılması gerektiği hakkında daha fazla bilgi için, buraya bakın .


NOTLAR:

  • Debian (ve Ubuntu uzantısına göre) varsayılan ~/.profilekaynağa da sahiptir ~/.bashrc. Bu, herhangi bir değişiklik size yapmak demektir ~/.bashrcaynı zamanda giriş kabukları tarafından miras alınacak ama) bu tüm Linux / Unix makinelerde durum böyle değildir ve ii) ters genellikle hep birlikte çalışması gerekir neden olduğu doğru değildir ~/.bashrcziyade & co ~/.profileya /etc/profile.

  • Ayrıca, kullanımla ilgili genel not, yapılandırma dosyalarında yapılan değişiklikler tüm kullanıcıları /etcetkileyecektir . Bu genellikle yapmak istediğin şey değildir ve kaçınılması gerekir. Her zaman ev dizininizdeki eşdeğer dosyaları kullanmalısınız ( ).~/

  • Çeşitli konfigürasyon dosyaları sırayla okunur. Özellikle, giriş kabukları için, sipariş:

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

    Bu, herhangi bir ayarın ~/.profileönceki dosyalarda ayarlanan herhangi bir şeyin üzerine yazacağı anlamına gelir .


1
Bu yazıya göre howtolamp.com/articles/… , ayrıca echo $0bir terminalden de çalıştırabilirsiniz ve çıktı bir "-" ile eklenmişse, o zaman bir giriş kabuğuna girersiniz .
stackoverflower

@stackoverflower benim sistemimde değil. Uzak, etkileşimli bir giriş kabuğu için işe yarar. Çalışırken görünmüyor bash -l. Her durumda, neden bu alakalı? Soru, ne tür bir kabuk çalıştırdığınızı nasıl kontrol edeceğinizle ilgili değil.
terdon

muhteşem bir yazı, aynı sorun olduğunda neden google'da görünmediğini merak ediyorum
Donato

@stackoverflower Başlatan bir "$0"şeye genişlerse -, oturum açma kabuğunuz olduğunu bilirsiniz. Ancak görüşme doğru değil: yokluğu -bir giriş kabuğuna girmemenizi sağlamaz. Oturum açma kabuklarını başlatmanın en yaygın yolları size liderlik eder -, ancak hepsini değil. man bashsöyler "Bir giriş kabuğu bir argümanının ilk karakteri sıfır bir olduğunu -, ya da bir ile başladı --loginseçenek." ( -lkısa şeklidir --login; eşdeğerdirler .) Bash'te shopt login_shellkontrol etmek için koşabilirsiniz .
Eliah Kagan,

2

Özellikle geçmişi ayarları gibi ayarlar için başka olasılık, HISTSIZE, HISTFILESIZE, HISTCONTROL, ve PS1dosyalar yüklenirken, ancak ayarları büyük olasılıkla suçlu olmak üzere sonradan kaynağıdır başka dosyada üzerine yazılır olmasıdır ~/.bashrc. (Sunucumuz için varsayılan bir ayar kümem var, root'un kullanıcıyı uyarması için kırmızı olan ve zaman damgası olan büyük geçmişleri belirten bir bilgi istemi gibi)

Varsayılan Ubuntu .bashrc, /etc/skelçeşitli ayarlar ayarlar; bu, sistem sahibi tarafından ayarlanan ayarları /etc/profile.d(Beğen /etc/bash.bashrc) .bashrcayarından geçersiz kılmayacağı bir yerden ayarlamaktan mantıklı gelebilir (Bir kullanıcı kendi ayarlarını düzenlerse, sistem varsayılan dosyalarının üzerine yazması iyidir. daha can sıkıcı)


2

Debian'da Terminal oturumu için bu sorunu tüm kullanıcılar için çözdüm:

ilave

sudo nano /etc/bash.bashrc

blok

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

itibaren

/etc/profile

1

Bu yolu takip et:

  • Düzenlemeyi Aç -> Tercihler
  • İlk sekmede "Genel", "Komut" etiketi altında "Komutu giriş kabuğu olarak çalıştır" seçeneğini etkinleştirin

-1

SÜRÜM = "16.04.3 LTS (Xenial Xerus)"

Tamam, herkes buradaki kişinin tüm kullanıcılar için /etc/profile.d/somefile.sh istemediğini kabul etti, ancak benim durumumda tam olarak istediğim buydu.

Aslında, eğer bunu kullanıyorsanız ve grafik kabuğunuzda etkili olmasını istiyorsanız, Ubuntu ile çıktığı gibi, yapmanız gereken tek şey dosyayı ayarlamak, daha sonra oturumu kapatıp tekrar açmak. Tüm konsollarınız veya başlattığınız herhangi bir şey xterm türü veya konsol türü (Veya kabuğu bırakarak) şimdi bu dosyaya sahip olacaktır.

Tüm kullanıcılar için .bashrc etc kullanmanıza gerek yoktur. Üzgünüm, bu sadece yukarıdaki cevap açık değildi. Söyledikleri her şey doğrudur, ancak gerçekte, Windows yöneticisinin başlattığı her şey bu ayarları devralacağından gerçekte doğru değildir, bu nedenle, yalnızca yeniden giriş yapın ve sorununuzu çözün ve niyetiniz tüm kullanıcılara uygulamaksa .bashrc ile uğraşmayın. .


2
Benim sorunum bu olduğunu tam olarak değil grafik kullanıcı arayüzü altında çalışacak terminalde meydana; Ubuntu 16.04.3 veya 18.04'te de.
Thomas Arildsen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.