J'en ai un function
dans mon .bashrc
dossier. Je sais ce qu'il fait, il augmente X de nombreux répertoires aveccd
C'est ici:
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
}
Mais pouvez-vous m'expliquer ces trois choses?
d=$d/..
sed 's/^\///'
d=..
Pourquoi ne pas faire comme ça:
up()
{
limit=$1
for ((i=1 ; i <= limit ; i++))
do
cd ..
done
}
Usage:
<<<>>>~$ up 3
<<<>>>/$
$OLDPWD
je me suis fait piétiner. Et sur zsh aveccd
set pour utiliser la dirstack, ça aussi.$1
àlimit
au lieu de simplement utiliser$1
dans la boucle?${1:-1}
place, comme dans la variante de glenn.d = $ d / ..
Ceci concatène le contenu actuel de var
d
avec/..
et le réassigned
.Le résultat final est de créer
d
une chaîne répétée comme/../../../..
.sed 's / ^ ///'
Supprimez l'interligne
/
de la chaîne fournie,d
(echo $ d) dans le code que vous avez publié.Probablement mieux écrit
sed 's|^/||'
pour éviter la barre oblique inverse.Une alternative (plus rapide et plus simple) est d'écrire
d=${d#/}
.d = ..
Attribuez la chaîne
..
au vard
.Cela n'a de sens que pour s'assurer qu'il en
d
existe au moins un..
au cas où le testif [ -z "$d" ]; then
signale que la vard
est vide. Et cela ne peut se produire que parce que la commande sed supprime un caractère ded
.S'il n'est pas nécessaire de supprimer le caractère de d, il n'est pas nécessaire de
sed
ouif
.Le code dans votre question remontera toujours d'au moins un dir.
Mieux
local d
suffit pour s'assurer que la variable est vide, rien d'autre n'est nécessaire.Cependant, local ne fonctionne que dans certains shells comme bash ou dash. En particulier,
ksh
(asyash
) n'a pas delocal
commande. Une solution plus portable est:La
for((
syntaxe n'est pas portable. Mieux vaut utiliser quelque chose comme:Robuste.
Si les valeurs données au premier argument de la fonction peuvent être négatives ou textuelles, la fonction doit être robuste pour traiter ces valeurs.
Tout d'abord, limitons les valeurs aux seuls nombres (je vais les utiliser
c
pourcount
):Et puis limitez la valeur de comptage uniquement à des valeurs positives:
Cette fonction acceptera rapidement 0 ou tout texte (sans erreur):
Retirez le
echo \
lorsque vous avez testé la fonction.la source