Tengo un functionen mi .bashrcarchivo. Sé lo que hace, intensifica X muchos directorios concd
Aquí está:
up()
{
local d=""
limit=$1
for ((i=1 ; i <= limit ; i++))
do
d=$d/..
done
d=$(echo $d | sed 's/^\///')
if [ -z "$d" ]; then
d=..
fi
cd $d
}
Pero, ¿puedes explicarme estas tres cosas?
d=$d/..sed 's/^\///'d=..
¿Por qué no hacer así?
up()
{
limit=$1
for ((i=1 ; i <= limit ; i++))
do
cd ..
done
}
Uso:
<<<>>>~$ up 3
<<<>>>/$

$OLDPWDpisotearon. Y en zsh concdset para usar el dirstack, eso también.$1enlimitlugar de simplemente usar$1en el bucle?${1:-1}en su lugar, como en la variante de Glenn.d = $ d / ..
Esto concatena el contenido actual de var
dcon/..y lo asigna de nuevo ad.El resultado final es hacer
duna cadena repetida como/../../../...sed 's / ^ ///'
Elimine el inicio
/de la cadena suministradad(echo $ d) en el código que publicó.Probablemente mejor escrito
sed 's|^/||'para evitar la barra invertida.Una alternativa (más rápida y simple) es escribir
d=${d#/}.d = ..
Asignar la cadena
..a la vard.Esto solo tiene sentido como una forma de garantizar que
dtenga al menos uno..en caso de que la pruebaif [ -z "$d" ]; thenindique que la vardestá vacía. Y eso solo puede suceder porque el comando sed está eliminando un personajed.Si no hay necesidad de eliminar el carácter de d, no hay necesidad de
sedoif.El código en su pregunta siempre subirá al menos un directorio.
Mejor
local des suficiente para asegurarse de que la variable esté vacía, no se necesita nada más.Sin embargo, el local solo funciona en algunos shells como bash o dash. En específico,
ksh(asyash) no tiene unlocalcomando. Una solución más portátil es:La
for((sintaxis no es portátil. Mejor use algo como:Robusto.
Si los valores dados al primer argumento de la función pueden ser negativos o de texto, la función debe ser robusta para procesar esos valores.
Primero, limitemos los valores a solo números (lo usaré
cparacount):Y luego limite el valor de conteo solo a valores positivos:
Esta función aceptará felizmente 0 o cualquier texto (sin errores):
Elimine el
echo \cuando haya probado la función.fuente