d=$d/..se agrega /..al contenido actual de la dvariable. dcomienza vacío, luego la primera iteración lo hace /.., la segunda, /../..etc.
sed 's/^\///'cae el primero /, entonces se /../..convierte ../..(esto se puede hacer usando un parámetro de expansión, d=${d#/}).
d=.. solo tiene sentido en el contexto de su condición:
if [ -z "$d" ]; then
d=..
fi
Esto garantiza que, si destá vacío en este momento, vaya al directorio principal. ( upsin argumento es equivalente a cd ..).
Este enfoque es mejor que el iterativo cd ..porque conserva cd -la capacidad de volver al directorio anterior (desde la perspectiva del usuario) en un solo paso.
La función se puede simplificar:
up() {
local d=..
for ((i = 1; i < ${1:-1}; i++)); do d=$d/..; done
cd $d
}
Esto supone que queremos subir al menos un nivel, y agrega n - 1 niveles, por lo que no necesitamos eliminar el inicio /o verificar si hay un vacío $d.
Usando Athena jot(el athena-jotpaquete en Debian):
up() { cd $(jot -b .. -s / "${1:-1}"); }
(basado en una variante sugerida por Glenn Jackman ).
$OLDPWDpisotearon. Y en zsh concdset para usar el dirstack, eso también.