Tengo un function
en mi .bashrc
archivo. 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
<<<>>>/$
$OLDPWD
pisotearon. Y en zsh concd
set para usar el dirstack, eso también.$1
enlimit
lugar de simplemente usar$1
en el bucle?${1:-1}
en su lugar, como en la variante de Glenn.d = $ d / ..
Esto concatena el contenido actual de var
d
con/..
y lo asigna de nuevo ad
.El resultado final es hacer
d
una 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
d
tenga al menos uno..
en caso de que la pruebaif [ -z "$d" ]; then
indique que la vard
está 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
sed
oif
.El código en su pregunta siempre subirá al menos un directorio.
Mejor
local d
es 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 unlocal
comando. 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é
c
paracount
):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