Mam function
w swoim .bashrc
pliku. Wiem, co robi, zwiększa X wiele katalogówcd
Oto on:
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
}
Ale czy możesz mi wyjaśnić te trzy rzeczy?
d=$d/..
sed 's/^\///'
d=..
Dlaczego nie zrobić tego tak:
up()
{
limit=$1
for ((i=1 ; i <= limit ; i++))
do
cd ..
done
}
Stosowanie:
<<<>>>~$ up 3
<<<>>>/$
$OLDPWD
przyszło mi do głowy , że zostałem zdeptany. I na Zsh zcd
zestawem, aby użyć Dirstack, to też.$1
dolimit
zamiast używania$1
w pętli?${1:-1}
Zamiast tego moglibyśmy użyć , jak w wariancie Glenna.d = $ d / ..
To Łączy obecne zawartość var
d
z/..
i przypisać go dod
.Końcowym rezultatem jest utworzenie
d
powtarzającego się łańcucha/../../../..
.sed 's / ^ ///'
Usuń wiodące
/
z podanego ciągud
(echo $ d) w opublikowanym kodzie.Prawdopodobnie lepiej napisane,
sed 's|^/||'
aby uniknąć odwrotnego ukośnika.Alternatywą (szybszą i prostszą) jest pisanie
d=${d#/}
.d = ..
Przypisz ciąg
..
do vard
.Ma to sens tylko jako sposób na upewnienie się, że
d
ma co najmniej jeden..
w przypadku, gdy testif [ -z "$d" ]; then
sygnalizuje, że vard
jest pusty. Może się to zdarzyć tylko dlatego, że polecenie sed usuwa jedną postaćd
.Jeśli nie ma potrzeby usuwania znaku z d, nie ma potrzeby używania
sed
lubif
.Kod w twoim pytaniu zawsze przesuwa się w górę o co najmniej jeden katalog.
Lepszy
local d
wystarczy, aby upewnić się, że zmienna jest pusta, nic więcej nie jest potrzebne.Jednak lokalne działa tylko w niektórych powłokach, takich jak bash lub dash. W szczególności
ksh
(asyash
) nie malocal
polecenia. Bardziej przenośnym rozwiązaniem jest:for((
Składnia nie jest przenośny. Lepiej użyj czegoś takiego:Krzepki.
Jeśli wartości podane w pierwszym argumencie funkcji mogą być ujemne lub tekstowe, funkcja powinna być odporna na przetwarzanie tych wartości.
Po pierwsze, ograniczmy wartości tylko do liczb (użyję
c
dlacount
):A następnie ogranicz wartość zliczania tylko do wartości dodatnich:
Ta funkcja na szczęście akceptuje 0 lub dowolny tekst (bez błędów):
Usuń
echo \
po przetestowaniu funkcji.źródło