Oppstartsfilene til Bash Skallet

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.

[Notat]

Notat

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

/etc/profile

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

/etc/profile.d Mappen

Nå opprett /etc/profile.d mappen, hvor de individuelle initialiseringsskriptene er plassert:

install --directory --mode=0755 --owner=root --group=root /etc/profile.d

/etc/profile.d/bash_completion.sh

[Notat]

Notat

Å 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.

/etc/profile.d/dircolors.sh

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

/etc/profile.d/extrapaths.sh

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
[Notat]

Notat

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.

/etc/profile.d/readline.sh

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

/etc/profile.d/umask.sh

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

/etc/profile.d/i18n.sh

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

Andre Initialiseringsverdier

Annen initialisering kan enkelt legges til profile ved å legge til flere skript i /etc/profile.d mappen.

/etc/bashrc

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.

~/.bash_profile

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

~/.profile

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

~/.bashrc

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

~/.bash_logout

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

/etc/dircolors

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.