-
d=$d/..
adiciona/..
ao conteúdo atual da variáveld
.d
começa vazio, depois a primeira iteração torna/..
, o segundo/../..
etc. -
sed 's/^\///'
cai o primeiro/
, então/../..
se torna../..
(isso pode ser feito usando uma expansão de parâmetro,d=${d#/}
). -
d=..
só faz sentido no contexto de sua condição:if [ -z "$d" ]; then d=.. fi
Isso garante que, se
d
estiver vazio nesse ponto, você vá para o diretório pai. (up
sem argumento é equivalente acd ..
.)
Essa abordagem é melhor do que iterativa cd ..
porque preserva cd -
- a capacidade de retornar ao diretório anterior (da perspectiva do usuário) em uma única etapa.
A função pode ser simplificada:
up() {
local d=..
for ((i = 1; i < ${1:-1}; i++)); do d=$d/..; done
cd $d
}
Isso pressupõe que queremos subir pelo menos um nível e adicionar níveis n - 1 , portanto, não é necessário remover o% principal/
ou verificar se há $d
vazia .
Usando o Athena jot
(o pacote athena-jot
no Debian):
up() { cd $(jot -b .. -s / "${1:-1}"); }
(baseado em um variante sugerido por glenn jackman ).