Wat is het .bashrc bestand?
Unix shells als je begint met het lezen van het .bashrc
bestand en het uitvoeren van commando’s die erin geschreven zijn. Wat is dit bestand en wat voert het uit?
Unix shells als je begint met het lezen van het .bashrc
bestand en het uitvoeren van commando’s die erin geschreven zijn. Wat is dit bestand en wat voert het uit?
Eigenlijk is het bash
specifiek dat .bashrc
leest (en /etc/bash.bashrc
). Er zijn veel verschillende shells.
De bash man pagina (door Brian Fox en Chet Ramey; ook info pagina “Bash Startup Files” ) is de gezaghebbende referentie:
Wanneer een interactieve shell die geen login shell is wordt gestart, leest en voert bash commando’s uit van
~/.bashrc
, als dat bestand bestaat. Dit kan worden voorkomen door de optie--norc
te gebruiken. De--rcfile
bestandsoptie zal bash dwingen om commando’s van bestand te lezen en uit te voeren in plaats van~/.bashrc
.Wanneer bash niet-interactief wordt gestart, om bijvoorbeeld een shell script uit te voeren, zoekt het de variabele
BASH_ENV
in de omgeving, breidt de waarde ervan uit als deze daar verschijnt, en gebruikt het de uitgebreide waarde als de naam van een bestand om te lezen en uit te voeren. Bash gedraagt zich alsof het volgende commando wordt uitgevoerd:if [-n "$BASH_ENV"]; then . "$BASH_ENV"; fi
maar de waarde van de variabele
PATH
wordt niet gebruikt om te zoeken naar de bestandsnaam.
Het bestand is gewoon shell commando’s. Het wordt meestal gebruikt om prompts te wijzigen, omgevingsvariabelen in te stellen en shellprocedures te definiëren. Traditioneel wordt het bestand .profile
voor dit doel gebruikt, maar bash
heeft zoveel extensies dat het zijn eigen opstartbestand nodig heeft voor gebruikers die bashisms in opstartbestanden willen zetten.
“Not a login shell” betekent dingen zoals het starten van een script en meestal het starten van terminalvensters door window managers. Soms stel ik een .bashrc
en BASH_ENV
systeem in om alleen bron .profile
te hebben. Zolang je niet buiten de POSIX-shell commando’s treedt, krijg je dezelfde initialisatie in elke willekeurige shell.
Het is vooral waardevol als sh
echt bash
is, wat soms gebeurt. Om dit te doen gebruik je:
. .profile
Een van de redenen dat dit allemaal zo complex is, is omdat mensen soms dingen die uitvoer produceren in shell opstartbestanden zetten, of ze stellen onvoorwaardelijk prompts in. Dit veroorzaakt veel problemen bij het uitvoeren van shell programma’s en backtick commando’s binnen talen, om nog maar te zwijgen van system(3)
van C programma’s. De manier waarop bash
opstart is ontworpen, denk ik, om één bestand te hebben waar de uitvoer en de prompt instelling OK is en één bestand waar dat niet het geval is. Traditioneel zou een run-time test worden gedaan om de interactiviteit te onderscheiden, bijvoorbeeld om te controleren of de prompt is ingesteld.
Wanneer Bash start, voert het de commando’s uit in verschillende scripts.
Wanneer Bash wordt aangeroepen als een interactieve login-shell, leest het eerst de commando’s uit het bestand /etc/profile en voert het deze uit, als dat bestand bestaat. Na het lezen van dat bestand, zoekt het naar ~/.bash_profile, ~/.bash_login, en ~/.profile, in die volgorde, en leest en voert het commando’s uit van het eerste bestand dat bestaat en leesbaar is.
Wanneer een login-shell wordt afgesloten, leest Bash commando’s uit het bestand ~/.bash_logout, als dat bestaat.
Wanneer een interactieve shell die geen login-shell is wordt gestart, leest Bash commando’s uit ~/.bashrc, als dat bestand bestaat, en voert die uit. Dit kan worden geremd door de –norc optie te gebruiken. De –rcfile file optie zal Bash dwingen om commando’s uit het bestand te lezen en uit te voeren in plaats van ~/.bashrc. http://en.wikipedia.org/wiki/Bash_(Unix_shell)
Hier zijn enkele trucs en tips: http://www.cyberciti.biz/tips/howto-linux-unix-bash-shell-setup-prompt.html
Laten we proberen de prompt in te stellen zodat deze de datum van vandaag en de hostnaam kan weergeven:
PS1="\d \h $ "
Het zou verschillende “initialisatie” commando’s voor je shell moeten bevatten, bijv.:
alias ll='ls -l'
).