Jak v sh prevest relativni cestu na absolutni?
Vancl Miroslav (QRIS)
Miroslav.Vancl na qris.cz
Pátek Duben 8 18:47:24 CEST 2005
> sice jen na Linuxu (RHEL-3 - package coreutils ), HP/UX a Solaris to
> nemaji ... musim sehnat
>
> Jen tak pro sport ... neznate nejake prenositelne reseni ...?
>
Trochu mi tu chybi podstatna informace: ma se jednat pouze o
normalizaci zapisu cesty, nebo taky o uplatnit symlinky ?
To prvni je reseno (alespon castecne) v jedne odpovedi (Ladislav
Vaiz), to druhe bude v dostatecne prenositelne podobe asi ponekud
komplikovanejsi.
Nedalo mi to a pokusil jsem se pocvicit v shellu a tady je vysledek
(je o to pro shell z rodiny Bourne shellu):
### zacatek skriptu
# Volani: skript pathname1 pathname2
# Vraci true pokud obe pathname existuji a jsou fyzicky (nejen
"textove") identicke, jinak vraci false
# Musim mit nastavenou absolutni cesty k prikazum ls a pwd ostatni
prikazy jsou v $PATH
ls=/bin/ls
pwd=/bin/pwd
normalize () {
n="$1"
if [ -d "$n" ]; then
cd "$n" && $pwd
return
fi
while true; do
b=`basename "$n"`
d=`dirname "$n"`
cd "$d" || return
d=`$pwd`
if [ ! -h "$b" ]; then
echo "$d/$b"
return
fi
n=`$ls -l "$b" | sed "s/.* -> \(.*\)/\1/"`
[ -n "$n" ] || return
done
}
f1=`normalize "$1"` || exit
f2=`normalize "$2"` || exit
[ "$f1" = "$f2" ]
### konec skriptu
Asi to nebude optimalni a urcite tam jsou i nejake chyby nebo
nedostatky. Jednim je napriklad to, ze se skript na zacyklenych symlincich
zacykli. To se da ale asi resit jen velmi tezko (nejaky napad ?). Obtizne
resitelne bude asi taky zohledneni moznosti vyskytu "->" ve jmenu symlinku
nebo jeho cili. Dalsi zadrhely mne ted nenapadaji.
M. Vancl
Další informace o konferenci Linux