Skallprogrammet /bin/bash
(heretter
referert til som bare "skallet") bruker en samling oppstartsfiler for
å hjelpe til med å lage et miljø. Hver fil har en spesifikk bruk og
kan påvirke innlogging og interaktive miljøer annerledes. Filene i
/etc
mappen gir generelt globale
innstillinger. Hvis en tilsvarende fil finnes i hjemmemappen din, kan
den overstyre de globale innstillingene.
Et interaktivt påloggingsskall startes etter en vellykket pålogging
ved hjelp av /bin/login
, ved å lese
/etc/passwd
filen. Denne skall
påkallelsen leser normalt /etc/profile
og dets private motsvar ~/.bash_profile
(eller ~/.profile
hvis kalt som
/bin/sh) ved oppstart.
Et interaktivt ikke-påloggingsskall startes vanligvis på
kommandolinjen ved å bruke et skallprogram (f.eks., [prompt]$
/bin/bash) eller av /bin/su kommandoen. Et interaktivt
ikke-påloggingsskall er også startet med et terminalprogram som f.eks
xterm eller
konsole fra et grafisk
miljø. Denne typen av skallpåkalling kopierer normalt det overordnede
miljøet og leser deretter brukerens fil ~/.bashrc
for ytterligere oppstart
konfigurasjonsinstruksjoner.
Et ikke-interaktivt skall er vanligvis til stede når et skallskript kjører. Det er ikke-interaktivt fordi det behandler et skript og ikke venter på brukerinndata mellom kommandoer. For disse skallpåkallelsene brukes kun miljøet arvet fra overordnet skall.
Filen ~/.bash_logout
brukes ikke til en
påkalling av skallet. Den leses og kjøres når en bruker går ut av et
interaktivt påloggingsskall.
Mange distribusjoner bruker /etc/bashrc
for hele systemets initialisering av skall som ikke er pålogget.
Denne filen kalles vanligvis fra brukerens ~/.bashrc
fil og er ikke bygget direkte inn i selve
bash. Denne
konvensjonen følges i denne seksjonen.
For mer informasjon se info bash -- Punkt: Bash Startup Files and Interactive Shells.
De fleste av instruksjonene nedenfor brukes til å lage filer som
ligger i /etc
mappestrukturen som
krever at du utfører kommandoene som root
bruker. Hvis du velger å opprette filer i
brukerens hjemmekataloger i stedet, bør du kjøre kommandoene som en
uprivilegert bruker.
Redaktørens notater: https://wiki.linuxfromscratch.org/blfs/wiki/bash-shell-startup-files
Her er en grunnleggende /etc/profile
.
Denne filen starter med å sette opp noen hjelpefunksjoner og noen
grunnleggende parametere. Det spesifiserer noen bash historie parametere og, for
sikkerhets formål, deaktiverer lagring av en permanent historikkfil
for root
bruker. Den kaller så små,
enkeltformålsskripter i /etc/profile.d
mappen for å gi det meste av
initialiseringen.
cat > /etc/profile << "EOF"
# Begin /etc/profile
# Written for Beyond Linux From Scratch
# by James Robertson <jameswrobertson@earthlink.net>
# modifications by Dagmar d'Surreal <rivyqntzne@pbzpnfg.arg>
# System wide environment variables and startup programs.
# System wide aliases and functions should go in /etc/bashrc. Personal
# environment variables and startup programs should go into
# ~/.bash_profile. Personal aliases and functions should go into
# ~/.bashrc.
# Functions to help us manage paths. Second argument is the name of the
# path variable to be modified (default: PATH)
pathremove () {
local IFS=':'
local NEWPATH
local DIR
local PATHVARIABLE=${2:-PATH}
for DIR in ${!PATHVARIABLE} ; do
if [ "$DIR" != "$1" ] ; then
NEWPATH=${NEWPATH:+$NEWPATH:}$DIR
fi
done
export $PATHVARIABLE="$NEWPATH"
}
pathprepend () {
pathremove $1 $2
local PATHVARIABLE=${2:-PATH}
export $PATHVARIABLE="$1${!PATHVARIABLE:+:${!PATHVARIABLE}}"
}
pathappend () {
pathremove $1 $2
local PATHVARIABLE=${2:-PATH}
export $PATHVARIABLE="${!PATHVARIABLE:+${!PATHVARIABLE}:}$1"
}
export -f pathremove pathprepend pathappend
# Set the initial path
export PATH=/usr/bin
# Attempt to provide backward compatibility with LFS earlier than 11
if [ ! -L /bin ]; then
pathappend /bin
fi
if [ $EUID -eq 0 ] ; then
pathappend /usr/sbin
if [ ! -L /sbin ]; then
pathappend /sbin
fi
unset HISTFILE
fi
# Set up some environment variables.
export HISTSIZE=1000
export HISTIGNORE="&:[bf]g:exit"
# Set some defaults for graphical systems
export XDG_DATA_DIRS=${XDG_DATA_DIRS:-/usr/share}
export XDG_CONFIG_DIRS=${XDG_CONFIG_DIRS:-/etc/xdg}
export XDG_RUNTIME_DIR=${XDG_RUNTIME_DIR:-/tmp/xdg-$USER}
for script in /etc/profile.d/*.sh ; do
if [ -r $script ] ; then
. $script
fi
done
unset script
# End /etc/profile
EOF
Nå opprett /etc/profile.d
mappen,
hvor de individuelle initialiseringsskriptene er plassert:
install --directory --mode=0755 --owner=root --group=root /etc/profile.d
Å bruke bash fullføringsskriptet nedenfor er kontroversielt. Ikke alle brukere liker det. Den legger til mange (vanligvis over 1000) linjer til bash miljøet og gjør det vanskelig å bruke 'set' kommandoen for å undersøke enkle miljøvariabler. Å utelate dette skriptet forstyrrer ikke bash sin evne til å bruke tabulatortasten for filnavnfullføring.
Dette skriptet importerer bash fullføringsskript, installert av mange andre BLFS pakker, for å tillate fullføring av TAB kommandolinje.
cat > /etc/profile.d/bash_completion.sh << "EOF"
# Begin /etc/profile.d/bash_completion.sh
# Import bash completion scripts
# If the bash-completion package is installed, use its configuration instead
if [ -f /usr/share/bash-completion/bash_completion ]; then
# Check for interactive bash and that we haven't already been sourced.
if [ -n "${BASH_VERSION-}" -a -n "${PS1-}" -a -z "${BASH_COMPLETION_VERSINFO-}" ]; then
# Check for recent enough version of bash.
if [ ${BASH_VERSINFO[0]} -gt 4 ] || \
[ ${BASH_VERSINFO[0]} -eq 4 -a ${BASH_VERSINFO[1]} -ge 1 ]; then
[ -r "${XDG_CONFIG_HOME:-$HOME/.config}/bash_completion" ] && \
. "${XDG_CONFIG_HOME:-$HOME/.config}/bash_completion"
if shopt -q progcomp && [ -r /usr/share/bash-completion/bash_completion ]; then
# Source completion code.
. /usr/share/bash-completion/bash_completion
fi
fi
fi
else
# bash-completions are not installed, use only bash completion directory
if shopt -q progcomp; then
for script in /etc/bash_completion.d/* ; do
if [ -r $script ] ; then
. $script
fi
done
fi
fi
# End /etc/profile.d/bash_completion.sh
EOF
Kontroller at mappen eksisterer:
install --directory --mode=0755 --owner=root --group=root /etc/bash_completion.d
For en mer fullstendig installasjon, se https://wiki.linuxfromscratch.org/blfs/wiki/bash-shell-startup-files#bash-completions.
Dette skriptet bruker ~/.dircolors
og /etc/dircolors
filer for å
kontrollere fargene på filnavn i en mappeoppføring. De
kontrollerer farget utdata av ting som ls --color. Forklaringen på
hvordan å initialisere disse filene er på slutten av denne delen.
cat > /etc/profile.d/dircolors.sh << "EOF"
# Setup for /bin/ls and /bin/grep to support color, the alias is in /etc/bashrc.
if [ -f "/etc/dircolors" ] ; then
eval $(dircolors -b /etc/dircolors)
fi
if [ -f "$HOME/.dircolors" ] ; then
eval $(dircolors -b $HOME/.dircolors)
fi
EOF
Dette skriptet legger til noen nyttige stier til PATH
og kan brukes til å tilpasse andre PATH
relaterte miljøvariabler (f.eks. LD_LIBRARY_PATH, etc) som kan
være nødvendig for alle brukere.
cat > /etc/profile.d/extrapaths.sh << "EOF"
if [ -d /usr/local/lib/pkgconfig ] ; then
pathappend /usr/local/lib/pkgconfig PKG_CONFIG_PATH
fi
if [ -d /usr/local/bin ]; then
pathprepend /usr/local/bin
fi
if [ -d /usr/local/sbin -a $EUID -eq 0 ]; then
pathprepend /usr/local/sbin
fi
if [ -d /usr/local/share ]; then
pathprepend /usr/local/share XDG_DATA_DIRS
fi
# Set some defaults before other applications add to these paths.
pathappend /usr/share/info INFOPATH
EOF
man programmet
automatisk utleder søkebanen for manualsider ved å undersøke
innholdet i PATH
variabelen, se
manpath(5) for
detaljer. Innstilling av MANPATH
variabel kan overstyre den automatiske utlederen, så BLFS
redaksjonen anbefaler ikke å sett det. Hvis du må sette den av
en eller annen grunn, er det bedre å starte verdien med et
kolon (:
), for eksempel
MANPATH=:/opt/somepkg/share/man:/opt/otherpkg/share/man
så stiene som er oppført i MANPATH
variabeln vil legges til den automatisk utledede verdien i
stedet for å overstyre det.
Dette skriptet setter opp standard inputrc
konfigurasjonsfil. Hvis brukeren ikke
har individuelle innstillinger, brukes den globale filen.
cat > /etc/profile.d/readline.sh << "EOF"
# Set up the INPUTRC environment variable.
if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ] ; then
INPUTRC=/etc/inputrc
fi
export INPUTRC
EOF
Innstilling av umask verdien er viktig for sikkerheten. Her er standard gruppe skrivetillatelser slått av for systemets brukere og når brukernavnet og gruppenavnet ikke er det samme.
cat > /etc/profile.d/umask.sh << "EOF"
# By default, the umask should be set.
if [ "$(id -gn)" = "$(id -un)" -a $EUID -gt 99 ] ; then
umask 002
else
umask 022
fi
EOF
Dette skriptet setter en miljøvariabel som er nødvendig for støtte for morsmål. En full diskusjon om å bestemme denne variabelen kan finnes på siden Konfigurere systemlokaliteten siden.
cat > /etc/profile.d/i18n.sh << "EOF"
# Set up i18n variables
for i in $(locale); do
unset ${i%=*}
done
if [[ "$TERM" = linux ]]; then
export LANG=C.UTF-8
else
source /etc/locale.conf
for i in $(locale); do
key=${i%=*}
if [[ -v $key ]]; then
export $key
fi
done
fi
EOF
Annen initialisering kan enkelt legges til profile
ved å legge til flere skript i
/etc/profile.d
mappen.
Her er en grunnleggende /etc/bashrc
.
Kommentarer i filen skal forklare alt du trenger.
cat > /etc/bashrc << "EOF"
# Begin /etc/bashrc
# Written for Beyond Linux From Scratch
# by James Robertson <jameswrobertson@earthlink.net>
# updated by Bruce Dubbs <bdubbs@linuxfromscratch.org>
# System wide aliases and functions.
# System wide environment variables and startup programs should go into
# /etc/profile. Personal environment variables and startup programs
# should go into ~/.bash_profile. Personal aliases and functions should
# go into ~/.bashrc
# Provides colored /bin/ls and /bin/grep commands. Used in conjunction
# with code in /etc/profile.
alias ls='ls --color=auto'
alias grep='grep --color=auto'
# Provides prompt for interaktive shells, specifically shells started
# in the X environment. [Review the LFS archive thread titled
# PS1 Environment Variable for a great case study behind this script
# addendum.]
NORMAL="\[\e[0m\]"
RED="\[\e[1;31m\]"
GREEN="\[\e[1;32m\]"
if [[ $EUID == 0 ]] ; then
PS1="$RED\u [ $NORMAL\w$RED ]# $NORMAL"
else
PS1="$GREEN\u [ $NORMAL\w$GREEN ]\$ $NORMAL"
fi
unset RED GREEN NORMAL
# GnuPG wants this or it'll fail with pinentry-curses under some
# circumstances (for example signing a Git commit)
tty -s && export GPG_TTY=$(tty)
# End /etc/bashrc
EOF
For mer informasjon om escape-sekvensene du kan bruke for prompten
(dvs. PS1
miljøvariabelen) se
info bash --
Node: Printing a
Prompt.
Her er en grunnleggende ~/.bash_profile
. Hvis du vil ha at hver ny bruker
skal få denne filen automatisk, bare endre utdataene til kommandoen
til /etc/skel/.bash_profile
og sjekk
tillatelser etter at kommandoen er kjørt. Deretter kan du kopiere
/etc/skel/.bash_profile
til
hjemmemappene til allerede eksisterende brukere, inkludert
root
, og angi eieren og gruppen
riktig.
cat > ~/.bash_profile << "EOF"
# Begin ~/.bash_profile
# Written for Beyond Linux From Scratch
# by James Robertson <jameswrobertson@earthlink.net>
# updated by Bruce Dubbs <bdubbs@linuxfromscratch.org>
# Personal environment variables and startup programs.
# Personal aliases and functions should go in ~/.bashrc. System wide
# environment variables and startup programs are in /etc/profile.
# System wide aliases and functions are in /etc/bashrc.
if [ -f "$HOME/.bashrc" ] ; then
source $HOME/.bashrc
fi
if [ -d "$HOME/bin" ] ; then
pathprepend $HOME/bin
fi
# Having . in the PATH is dangerous
#if [ $EUID -gt 99 ]; then
# pathappend .
#fi
# End ~/.bash_profile
EOF
Her er en grunnleggende ~/.profile
.
Kommentarene og bruksanvisningen /etc/skel
for .bash_profile
ovenfor gjelder også her. Bare
målfilnavnet er forskjellige.
cat > ~/.profile << "EOF"
# Begin ~/.profile
# Personal environment variables and startup programs.
if [ -d "$HOME/bin" ] ; then
pathprepend $HOME/bin
fi
# Set up user specific i18n variables
#export LANG=<ll>
_<CC>
.<charmap>
<@modifiers>
# End ~/.profile
EOF
Her er en grunnleggende ~/.bashrc
.
cat > ~/.bashrc << "EOF"
# Begin ~/.bashrc
# Written for Beyond Linux From Scratch
# by James Robertson <jameswrobertson@earthlink.net>
# Personal aliases and functions.
# Personal environment variables and startup programs should go in
# ~/.bash_profile. System wide environment variables and startup
# programs are in /etc/profile. System wide aliases and functions are
# in /etc/bashrc.
if [ -f "/etc/bashrc" ] ; then
source /etc/bashrc
fi
# Set up user specific i18n variables
#export LANG=<ll>
_<CC>
.<charmap>
<@modifiers>
# End ~/.bashrc
EOF
Dette er en tom ~/.bash_logout
som
kan brukes som en mal. Du vil legge merke til at grunnleggende
~/.bash_logout
inkluderer ikke en
clear
kommando.
Dette er fordi det clear håndteres i /etc/issue
filen.
cat > ~/.bash_logout << "EOF"
# Begin ~/.bash_logout
# Written for Beyond Linux From Scratch
# by James Robertson <jameswrobertson@earthlink.net>
# Personal items to perform on logout.
# End ~/.bash_logout
EOF
Hvis du ønsker å bruke dircolors
kapasiteten, kjør følgende kommando. /etc/skel
oppsettstrinn vist ovenfor kan også
brukes her for å gi en ~/.dircolors
fil når en ny bruker settes opp. Som før, bare endre
utdatafilnavnet på følgende kommando og sikre at tillatelsene,
eieren og gruppen er korrekte på filene opprettet og/eller kopiert.
dircolors -p > /etc/dircolors
Hvis du ønsker å tilpasse fargene som brukes for forskjellige
filtyper, kan du redigere /etc/dircolors
filen. Instruksjonene for å sette
fargene er innebygd i filen.
Endelig har Ian Macdonald skrevet en utmerket samling tips og triks for å forbedre skallmiljøet ditt. Du kan lese den på nett https://caliban.org/bash/index.shtml.