Okay, nog een paar dingetjes voor je papiertje dan
.
De | is de zogenaamde pipe. Een pipe geeft de uitvoer van het commando links als invoer aan het commando rechts ervan. Een voorbeeldtoepassing is het pipen naar less. less is een programmaatje waarmee je door grote stukken tekst kunt bladeren. ls | less in een volle directory zorgt ervoor dat je rustig kunt bladeren door de vele tekst.
De > schrijft wat normaal op je scherm aan uitvoer komt naar de file rechts. ls > ~/blaat zet dus de directory listing in de file blaat in je home directory (over ~ had ik al verteld, toch
?).
>> lijkt erg op >. Het verschil is dat >> de uitvoer achter de bestaande data in de doel-file plakt waar > de file overschrijft.
Een ander neefje hiervan is 2> . >, >> en | gebruiken namelijk data die bedoeld is voor stdout (standard out), dit is het "apparaat" waar standaarduitvoer heengeleid wordt en waarvan de invoer normaliter op je scherm verschijnt. Naast stdout heb je ook stderr (standard error), dit is het "apparaat" waar programma's hun foutmeldingen heenschrijven. Waar > stdout naar een file schrijft doet 2> dit met stderr. Als je dus rare fouten krijgt kun je de foutmeldingen bewaren. Maar het is ook voor iets anders nuttig.
Op de universiteit zijn er bij ons best veel studenten die in hun homedirectory handige software hebben die niet op het systeem zelf geïnstalleerd staat. Als ik eens wil kijken in de home directories van iedereen of een bepaald iets er is doe ik:
find / 2> /dev/null | grep 'programma'
find kom ik later op, grep ook. Het probleem is dat als je find gebruikt je foutmeldingen krijgt wanneer je geen permissie hebt een directory te lezen. Op een groot systeem kun je tussen die foutmeldingen hetgene wat je zocht nauwelijks meer terugvinden. Wat ik dus doe is de stderr van find naar /dev/null schrijven zodat ik er geen last meer van heb. /dev/null is het grote zwarte gat van je unix-systeem: alles wat je erin stopt is weg, ideaal om rommel heen te dirigeren die je niet nodig hebt.
Ik noemde find al, je kunt ermee files zoeken. Ik weet eerlijk gezegd alleen niet goed hoe het werkt omdat ik het thuis nooit gebruik. Ik hou meer van slocate. Doe als root eens slocate -u en heb even geduld. Doe dan eens slocate filenaam om iets op te zoeken... het staat er gelijk
. slocate -u maakt een index aan van files op je systeem zodat je supersnel kunt zoeken.
pwd is heel simpel: print working directory.
df en du zijn ook nuttig. df laat zien hoeveel ruimte er vrij is op elk file system, du laat het verbruik van dingen in de huidige directory zien. -h zorgt bij beide commando's dat de aantallen met prefixen als kilo en mega en dergelijke weergegeven worden voor de leesbaarheid. bij du heeft de switch -s het gevolg dat je alleen een samenvatting van elk argument krijgt. Als ik op de uni wil weten waar de meeste troep in m'n homedir zit (met megabytes, prefix M) doe ik: du -sh * | grep 'M' . Dan krijg ik alle directories met verbruik met een M erin.
grep noemde ik ook. grep en zijn vriendjes kun je filters met reguliere expressies mee maken. Natuurlijk kun je ze ook simpel laten, maar het kan sowieso handig zijn om de uitvoer wat te filteren zoals in de voorbeelden die ik al gaf. Handige switches voor grep zijn -i (maakt het argument case insensitive) en -r (daarmee duik je ook in subdirectories). Wat op z'n tijd wel hip was was het aantal keren dat er "fuck" in de linux source code staat. Dit kun je, als je de source code hebt uitgepakt ergens, doen met:
grep -ir 'fuck' * | wc -l
Patroonzoeken met grep en de uitvoer voeren aan wc. wc is word count, de switch -l zorgt dat-ie regels gaat tellen.
En met alles: lees even de man page
. Ook die van cp, rm, mv trouwens. cd ken je waarschijnlijk wel, hiervan nog een paar weetjes:
. is de huidige directory waar je bent en .. zijn parent. Een directory omhoog doe je dus met cd .. . Een programma uitvoeren dat in de directory staat doe je met ./programma . Normaliter kun je
niet gewoon programma typen en op enter drukken. Dit komt omdat de directory . normaliter niet in het zoekpad staat waar bash probeert commando's te zoeken (/bin staat er wel in bv, kijk maar eens wat er in /bin staat, dan zie je vast een hoop bekends). Dit heeft een reden: stel dat iemand een naar script met de naam ls in je home directory gezet heeft en je doet ls in die directory. Dan wordt dat script uitgevoerd en niet de echte ls. Dat je ./ voor een programma in een directory typt is dus een veiligheidsmaatregel om te zorgen dat je snapt wat je precies uitvoert.
Ook met du is . handig: doe du -sh . ergens en je krijgt netjes te zien hoe groot die directory is.
Allerlaatste nu is het concept symlink (of zachte link). Op een unix filesystem kun je pointers (wijzertjes) naar files maken zodat je een file niet hoeft te kopiëren, maar de file toch via een bepaald pad te bereiken is. Het is een beetje als een windows-stijl shortcut, maar dan op filesystemniveau. Voor een programma is een file of een symlink ernaar namelijk hetzelfde, bepaalde (meisjes :X ) mensen die me soms een file proberen te sturen sturen me een .lnk (een windows shortcut file), bij een symlink zou ik alsnog de echte file gekregen hebben.
ln -s /pad/naar/file creëert een symlink met de naam file in m'n huidige directory. ln -s /pad/naar/file nieuwenaam geeft de symlink een andere naam. Een symlink verwijderen kun je gewoon doen met rm; alleen de link wordt verwijderd, niet de file zelf.
Een concreet voorbeeld van symlinks is dat ik voor Firefox de java-plugin wilde installeren. Het is erg lang geleden, maar ik moest toen een symlink maken naar lib_java_oji.so (of zoiets) in de directory van java in de mozilla plugins directory. Op die manier heeft mozilla die plugin-file beschikbaar zonder dat ik 'm hoefde te kopiëren. Daarnaast gaat updaten ook vanzelf omdat je alleen het origineel hoeft te veranderen; de symlinks zijn per definitie immers identiek aan het origineel.
Okay, en nu hou ik op voor vandaag
.