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