У меня есть function
в моем .bashrc
файле. Я знаю, что он делает, он увеличивает X каталогов сcd
Вот:
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
}
Но можете ли вы объяснить эти три вещи из этого для меня?
d=$d/..
sed 's/^\///'
d=..
Почему бы просто не сделать так:
up()
{
limit=$1
for ((i=1 ; i <= limit ; i++))
do
cd ..
done
}
Использование:
<<<>>>~$ up 3
<<<>>>/$
$OLDPWD
быть растоптанным пришло на ум. И на zsh сcd
установленным для использования dirstack, это тоже.$1
наlimit
вместо использования$1
в цикле?${1:-1}
вместо этого, как в варианте Гленна.д = $ д / ..
Это объединяет текущее содержимое var
d
с/..
и присваивает его обратноd
.Конечным результатом является создание
d
повторяющейся строки, как/../../../..
.sed 's / ^ ///'
Удалите начальную
/
строку из предоставленной строкиd
(echo $ d) в коде, который вы разместилиНаверное, лучше написано,
sed 's|^/||'
чтобы избежать обратной косой черты.Альтернатива (быстрее и проще) - написать
d=${d#/}
.d = ..
Назначьте строку
..
в vard
.Это имеет смысл только как способ обеспечить наличие
d
хотя бы одного..
в случае, если тестовыеif [ -z "$d" ]; then
сигналы указывают на то, что переменнаяd
пуста. И это может произойти только потому, что команда sed удаляет один символ изd
.Если нет необходимости удалять символ из d, нет необходимости в
sed
илиif
.Код в вашем вопросе всегда будет перемещаться вверх хотя бы на один каталог.
Лучше
local d
достаточно, чтобы убедиться, что переменная пуста, больше ничего не нужно.Однако локальный работает только в некоторых оболочках, таких как bash или dash. В частности,
ksh
(какyash
) не имеетlocal
команды. Более портативное решение:for((
Синтаксис не является переносимым. Лучше использовать что-то вроде:Robust.
Если значения, данные первому аргументу функции, могут быть отрицательными или текстовыми, функция должна быть устойчивой для обработки этих значений.
Во-первых, давайте ограничим значения только цифрами (я буду использовать
c
дляcount
):А затем ограничьте значение счетчика только положительными значениями:
Эта функция с радостью примет 0 или любой текст (без ошибок):
Удалите,
echo \
когда вы проверили функцию.источник