Ich bin neu in Ubuntu. Ich verwende 13.10 Desktop.
Ich wollte einige systemweite Aliase und eine benutzerdefinierte Eingabeaufforderung für Bash festlegen. Ich habe diesen Artikel gefunden:
https://help.ubuntu.com/community/EnvironmentVariables
Den Ratschlägen in diesem Artikel folgend, habe ich /etc/profiles.d/profile_local.sh erstellt. Es gehört root und hat die Berechtigungen 644, genau wie die anderen Skripte dort:
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
Ich habe weiterhin bestätigt, dass / etc / profile /etc/profile.d aufruft. Es enthält diesen Codeblock:
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
Bei der Anmeldung scheint es nicht so zu sein, dass das benutzerdefinierte Skript profile_local.sh, das ich erstellt habe, bezogen wird. Wenn ich mich jedoch nach dem Anmelden als "source /etc.profile.d/profile_local.sh" anmelde, erhalte ich das erwartete Verhalten, meine benutzerdefinierten Aliase und die benutzerdefinierte Eingabeaufforderung.
Was mache ich falsch?
Inhalt des Skripts '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
.sh
, es ist irrelevant, und die Dateien, ausprofile.d
denen sie stammen, werden nicht ausgeführt, was sich geringfügig unterscheidet und keine ausführbare Datei erfordert. Das Problem hierbei ist, dassprofile
& co nicht von Nicht-Login-Skripten gelesen werden..bashrc
Sie einfach und alle Ihre Probleme werden verschwinden. Es ist auch eine Frage der Rangfolge, wenn eine der Dateien, die anschließend gelesen werden, auch PS1 setzt, wird der vorherige Wert verworfen. Wie auch immer, im Ernst, berühren Sie nicht die Ordner/etc
, spielen Sie mit denen in Ihrem Heimverzeichnis und verwenden Sie.bashrc
kein Profil..profile
in Ihrem Heim und die Einstellungen dort überschreiben alles, was Sie tun/etc/profile
. Grundsätzlich niemals anfassen, es/etc
sei denn, Sie wissen, was Sie tun. Dafür sind die benutzerspezifischen Dateien gedacht. Bitte bearbeite auch deine Frage und erkläre genau, wie du dich verbindest, das ändert alles./etc/profile.d
einer wirklich schlechten Idee, die alle Benutzer des Systems betrifft. Gerade ist die Befehleprofile_local.sh
in Ihrem~/.profile
oder einfach das Skript beziehen , indem Sie diese Zeile in dem Hinzufügen~/.profile
:. /path/to/profile_local.sh
. (Das.
bedeutetsource
, es liest die Datei, die Sie ihm geben, und führt die Befehle aus, die es dort findet).Antworten:
Um zu verstehen, was hier vor sich geht, müssen Sie einige Hintergrundinformationen darüber verstehen, wie Shells (in diesem Fall bash) ausgeführt werden.
Wenn Sie beispielsweise einen Terminalemulator öffnen
gnome-terminal
, führen Sie eine sogenannte interaktive Shell ohne Anmeldung aus .Wenn Sie sich über die Befehlszeile an Ihrem Computer anmelden
ssh
oder einen Befehl ausführen, z. B.su - username
, führen Sie eine interaktive Anmeldeshell aus .Wenn Sie sich grafisch anmelden, wird etwas völlig anderes ausgeführt. Die Details hängen von Ihrem System und Ihrer grafischen Umgebung ab. Im Allgemeinen ist es jedoch die grafische Shell , die sich mit Ihrer Anmeldung befasst. Während viele Grafik-Shells (einschließlich der Ubuntu-Standard-Shells)
/etc/profile
nicht alle von ihnen lesen .Wenn Sie ein Shell-Skript ausführen, wird es in einer nicht interaktiven Shell ohne Anmeldung ausgeführt .
Nun hängen die Dateien, die beim Start von bash gelesen werden, von der Art der Shell ab, unter der sie ausgeführt wird. Das Folgende ist ein Auszug aus dem Abschnitt INVOCATION von
man bash
(Schwerpunkt Mine):Dies bedeutet, dass Sie die falsche Datei bearbeiten. Sie können dies testen, indem Sie auf eine virtuelle Konsole mit Ctrl+ Alt+ F2(kehren Sie mit Alt+ F7oder F8abhängig von Ihrem Setup zur GUI zurück ) fallen und sich dort anmelden. Sie werden sehen, dass Ihre Eingabeaufforderung und Aliase verfügbar sind.
Damit die gewünschte Einstellung auf nicht angemeldete Shells angewendet wird, sollten Sie
~/.bashrc
stattdessen die Änderungen vornehmen, die Sie bei jedem Öffnen eines Terminals erhalten . Alternativ können Sie auch Ihre Aliase in die Datei einfügen~/.bash_aliases
(beachten Sie jedoch, dass dies eine Ubuntu-Funktion ist und Sie nicht erwarten sollten, dass sie auf anderen Distributionen funktioniert).Weitere Informationen dazu, welche Datei für welche Zwecke verwendet werden soll, finden Sie hier .
ANMERKUNGEN:
Debian (und durch Erweiterung Ubuntu) hat auch die
~/.profile
Standardquelle~/.bashrc
. Dies bedeutet, dass alle Änderungen, die Sie vornehmen,~/.bashrc
auch von Login-Shells übernommen werden. I) Dies ist jedoch nicht bei allen Linux / Unix-Maschinen der Fall, und ii) das Gegenteil ist nicht der Fall, weshalb Sie im Allgemeinen immer mit~/.bashrc
& co anstatt mit~/.profile
oder arbeiten sollten/etc/profile
.Ein allgemeiner Hinweis zur Verwendung sowie Änderungen an den Konfigurationsdateien in
/etc
wirken sich auf alle Benutzer aus. Dies ist normalerweise nicht das, was Sie tun möchten und sollte vermieden werden. Sie sollten immer die entsprechenden Dateien in Ihrem Home-Verzeichnis verwenden (~/
).Die verschiedenen Konfigurationsdateien werden nacheinander gelesen. Insbesondere für Login-Shells lautet die Reihenfolge:
Dies bedeutet, dass alle Einstellungen
~/.profile
in den vorherigen Dateien alle Einstellungen überschreiben.quelle
echo $0
von einem Terminal aus ausführen. Wenn der Ausgabe ein "-" vorangestellt ist, befinden Sie sich in einer Anmeldeshell.bash -l
. Warum ist das auf jeden Fall relevant? Die Frage ist nicht, wie Sie überprüfen können, welche Art von Shell Sie ausführen."$0"
zu etwas erweitert wird, das mit beginnt-
, wissen Sie, dass Sie eine Anmeldeshell haben. Das Gegenteil ist jedoch nicht der Fall: Das Fehlen von-
stellt nicht sicher, dass Sie sich nicht in einer Anmeldeshell befinden. Die gebräuchlichsten Methoden zum Starten von Login-Shells führen Sie an-
, aber nicht alle.man bash
teilt uns mit "Eine Login-Shell ist eine Shell, deren erstes Zeichen des Arguments Null ein ist-
, oder eine Shell , die mit der--login
Option gestartet wurde ." (-l
ist die Kurzform von--login
; sie sind gleichwertig .) In Bash können Sie ausführenshopt login_shell
, um zu überprüfen.Eine weitere Möglichkeit, vor allem für Einstellungen wie die Geschichte Einstellungen
HISTSIZE
,HISTFILESIZE
,HISTCONTROL
, undPS1
ist , dass die Dateien geladen werden, aber Einstellungen werden in einer anderen Datei überschreibt , die Quelle später ist, mit dem wahrscheinlichste Täter zu sein~/.bashrc
. (Ich habe einen Standardsatz von Einstellungen für unsere Server, wie eine rote Eingabeaufforderung für root, um den Benutzer zu warnen, und große Historien mit Zeitstempeln.)Das Standard-Ubuntu
.bashrc
von/etc/skel
legt mehrere Einstellungen fest, die möglicherweise sinnvoll waren, um Einstellungen zu ändern, die vom Systembesitzer von/etc/profile.d
(Gefällt mir/etc/bash.bashrc
) festgelegt wurden (Wenn ein Benutzer sie bearbeitet.bashrc
, können die Standarddateien des Systems problemlos überschrieben werden nerviger sind)quelle
In der Debian for Terminal-Sitzung habe ich dieses Problem für alle Benutzer so gelöst:
hinzugefügt zu
Block
von
quelle
Folge diesem Pfad:
quelle
VERSION = "16.04.3 LTS (Xenial Xerus)"
Okay, alle sind davon ausgegangen, dass die Person hier nicht für alle Benutzer /etc/profile.d/somefile.sh möchte, aber in meinem Fall ist das genau das, was ich wollte.
Wie sich bei Ubuntu herausstellt, müssen Sie nur die Datei festlegen und sich dann abmelden und wieder anmelden, wenn Sie dies verwenden und möchten, dass es in Ihrer grafischen Shell wirksam wird. Alle Ihre Konsolen oder alles, was Sie starten, ob es sich um einen xterm-Typ oder einen Konsolentyp handelt (oder auf die Shell abgelegt wird), haben jetzt diese Datei bezogen.
Es ist nicht erforderlich, .bashrc usw. für alle Benutzer zu verwenden. Entschuldigung, das war in der obigen Antwort einfach nicht klar. Alles, was sie sagten, ist wahr, aber in Wirklichkeit ist es meistens nicht wahr, da alles, was der Windows-Manager startet, diese Einstellungen erbt. Melden Sie sich einfach erneut an und lösen Sie Ihr Problem .
quelle