Eu tenho um function
no meu .bashrc
arquivo. Eu sei o que ele faz, intensifica X muitos diretórios comcd
Aqui 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
}
Mas você pode explicar essas três coisas para mim?
d=$d/..
sed 's/^\///'
d=..
Por que não fazer assim:
up()
{
limit=$1
for ((i=1 ; i <= limit ; i++))
do
cd ..
done
}
Uso:
<<<>>>~$ up 3
<<<>>>/$
$OLDPWD
ser pisoteado veio à mente. E no zsh comcd
set para usar o dirstack, isso também.$1
aolimit
invés de apenas usar$1
no loop?${1:-1}
vez disso, poderíamos usar , como na variante de Glenn.d = $ d / ..
Este concatena o conteúdo presente do var
d
com/..
e atribuí-lo de volta parad
.O resultado final é criar
d
uma sequência repetida como/../../../..
./ s / ^ /// '
Remova o líder
/
da sequência fornecidad
(eco $ d) no código que você postou.Provavelmente melhor escrito
sed 's|^/||'
para evitar a barra invertida.Uma alternativa (mais rápida e simples) é escrever
d=${d#/}
.d = ..
Atribua a string
..
à vard
.Isso só faz sentido como uma maneira de garantir que
d
haja pelo menos um..
caso o testeif [ -z "$d" ]; then
indique que o vard
está vazio. E isso só pode acontecer porque o comando sed está removendo um caractered
.Se não houver necessidade de remover o caractere de d, não haverá necessidade de
sed
ouif
.O código na sua pergunta sempre subirá pelo menos um diretório.
Melhor
local d
é suficiente para garantir que a variável esteja vazia, nada mais é necessário.No entanto, o local funciona apenas em alguns shells como bash ou dash. Em específico,
ksh
(asyash
) não possui umlocal
comando. Uma solução mais portátil é:A
for((
sintaxe não é portátil. Melhor usar algo como:Robusto.
Se os valores dados ao primeiro argumento da função puderem ser negativos ou texto, a função deve ser robusta para processar esses valores.
Primeiro, vamos limitar os valores a apenas números (usarei
c
paracount
):E, em seguida, limite o valor da contagem apenas a valores positivos:
Esta função aceita 0 ou qualquer texto (sem erros):
Remova o
echo \
quando você tiver testado a função.fonte