d=$d/..
se agrega /..
al contenido actual de la d
variable. d
comienza 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 d
está vacío en este momento, vaya al directorio principal. ( up
sin 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-jot
paquete en Debian):
up() { cd $(jot -b .. -s / "${1:-1}"); }
(basado en una variante sugerida por Glenn Jackman ).
$OLDPWD
pisotearon. Y en zsh concd
set para usar el dirstack, eso también.