golfje-still

cd en zo (of: DOS driveletters op Unix?)

nerd alertDe command prompt heeft al eeuwen de eigenschap dat je in een „huidige” directory werkt. Tegenwoordig heb je vaak te maken met erg lange directorynamen, als je dan in twee (of meer) lange paden tegelijk werkt kan dat lastig worden. Bestaat er niet een gemakkelijk alternatief in de Unix shell?

dos heeft driveletters

In principe gebruik je cd om te veranderen wat je „huidige directory” is. Onder dos en Windows hebt je een alfabet aan driveletters en elk van die driveletters heeft een eigen huidige directory. Een van de driveletters is je huidige drive. Als je onder dos moet werken met meerdere lange directorynamen op één fysieke drive, dan kan je SUBST gebruiken om een extra driveletter aan te maken voor die drive, zodat je de twee letters elk naar een eigen pad kunt laten verwijzen. In de praktijk werkt dit erg handig. Bestaat hiervoor een alternatief onder Unix?

Unix heeft golfjes

Ik heb verschillende alternatieve oplossing gezocht die te maken had met het aanmaken van symbolische links onder ~ (je eigen homedirectory), bijvoorbeeld ~/s voor een sourcedirectory en ~/t voor een targetdirectory. Ik maakte die links met ln. Onder Unix mag je bijvoorbeeld c: prima gebruiken als naam voor een script, dus hier zou iets mee te maken moeten zijn.

Om het nog net iets mooier te maken, zou je voor dit doel extra users op het systeem kunnen aanmaken: je kunt de homedirectory van die user instellen en vervolgens ~usernaam gebruiken om te verwijzen naar die homedirectory — homedirectories hoeven namelijk niet per definitie onder /home te staan (kijk maar eens naar het verschil tussen echo ~root en eval echo ~$USER), al is het aanmaken van een extra user alleen om zijn homedirectory te gebruiken natuurlijk wel nogal omslachtig.

pushd, popd, dirs

Gelukkig ontdekte ik dat er meer golfjes bestaan in Unix, dan alleen de homedirectories. Je kunt namelijk ~1 tot en met ~99 laten verwijzen naar padnamen, als een echt alternatief voor driveletters. Dat doe je door gebruik te maken van het setje commando’s dirs, pushd en popd.

  • Zo’n numeriek golfje kan je toevoegen met pushd:
    dit commando voegt de huidige directory toe aan de lijst;
  • Met dirs kan je het actuele overzicht opvragen.

In het bewegende gifje hieronder zie je een voorbeeld uit de praktijk. Ik was met Nautilus (dat is de Explorer van Ubuntu) de downloaddirectory aan het bekijken van een andere computer in het netwerk. Ik wilde controleren of de bestanden die er staan identiek zijn aan wat er op de nas staat. Hieronder zie je hoe ik:

  1. met drag-en-drop naar de tijdelijke directory op die andere computer ga;
  2. hiervoor ~1 aanmaak;
  3. naar de directory met installatiebestanden op de nas ga (binnendoor);
  4. hiervoor ~2 aanmaak;
  5. een lijst opvraag van de actuele numerieke golfjes;
  6. zoek naar dubbelen in directory ~1 en ~2.

golfje

Er bestaan nog andere varianten van het golfje, bijvoorbeeld ~- en ~-0, maar wat daarmee de mogelijkheden zijn, is leuk om uit te zoeken op een regenachtige zondagmiddag.

cd en $CDPATH

De „golfjes” kan je gebruiken als parameter voor het commando cd, maar cd accepteert ook de nog een andere parameter; gebruik cd - om terug te gaan naar de directory die de huidige directory was voor het vorige cd commando ($OLDPWD). Gebruik cd zonder parameter om te gaan naar je eigen homedirectory ($HOME).

Als je een relatief pad opgeeft, gaat cd normaal gesproken naar een subdirectory van de huidige directory. Maar door het configureren van de $CDPATH variabele, kan je zorgen dat cd ook nog in andere directories gaat zoeken, als de opgegeven naam niet voorkomt in de huidige directory.

.bashrc

Om een en ander gemakkelijker te gebruiken te maken, heb ik voor mezelf de volgende aliassen ingesteld in mijn .bashrc:

alias cd..='cd ..'
alias dirs='dirs -v'
export CDPATH=:~://diskstation
pushd(){
if [ $# = 0 ] ; then
command pushd -n . >/dev/null; command pushd -n +1
else
command pushd "$@"
fi
}
cdd(){
if [ $# != 2 ] ; then
echo 'cdd: usage: cdd [find] [replace]'
else
local cdd1=${PWD/$HOME/\~}
local cdd2=${cdd1/$1/$2}
if [ $cdd1 = $cdd2 ] ; then
echo 'not found'
return -1
else
eval cd $cdd2
fi
fi
}

Toelichting:

alias cd.. omdat ik nog steeds vaak de spatie vergeet die in dos niet nodig is.

dirs pas ik aan zodat je een leesbaar overzicht krijgt.

$CDPATH zorgt dat cd voor relatieve padnamen eerst kijkt in de huidige directory, daarna in subdirectories van mijn home directory, daarna in de shares op mijn nas.

pushd heb ik aangepast zodat je de huidige directory niet vooraan, maar achteraan toevoegt, zodat bestaande nummers gelijk blijven.

cdd zoek-en-vervang in het huidige pad, maar laat wel de homedirectory intact.

Poll

Vertel jouw mening

Vul je gegevens in of klik op een icoon om in te loggen.

WordPress.com logo

Je reageert onder je WordPress.com account. Log uit / Bijwerken )

Twitter-afbeelding

Je reageert onder je Twitter account. Log uit / Bijwerken )

Facebook foto

Je reageert onder je Facebook account. Log uit / Bijwerken )

Google+ photo

Je reageert onder je Google+ account. Log uit / Bijwerken )

Verbinden met %s