Что-то вроде этого, я думал, это сработает:
alias ls='[[ "$PWD" = "/" ]] && ls -I test ||ls'
$PWD
- текущий рабочий каталог
&&
выполняет действие, если pwd равен /
(проверка условия =true)
||
выполняет действие, если pwd не равен /
(проверка условия =false)
Но после тщательного тестирования вышеуказанное решение НЕ РАБОТАЕТ.
С другой стороны, это будет нормально работать как альтернатива функциям:
alias ls='{ [[ "$PWD" == "/" ]] && a="-I tmp2" ||a=""; };ls $a '
Или даже лучше, аналогично другим ответам, но без использования функции:
alias lstest='{ [[ "$PWD" == "/" ]] && set -- "-I" "tmp2" || set --; }; ls "$@"'
Возможные дополнительные флаги и/или полные пути, указанные в командной строке при вызове этого псевдонима, сохраняются и передаются в ls.
Используйте функцию, которая проверяет, находитесь ли вы в /
для ls
:
ls () {
if [[ "$PWD" == / ]]
then
command ls -I test "$@"
else
command ls "$@"
fi
}
Таким образом, любые аргументы, переданные в ls
по-прежнему будет использоваться.
Или:
ls () {
if [ "$PWD" == / ]
then
set -- -I test "$@"
fi
command ls "$@"
}
ls () {
case "$PWD" in
/) command ls -I test "$@" ;;
*) command ls "$@" ;;
esac
}
Приведенная выше функция оболочки проверит текущий каталог на соответствие /
и выполнит команду GNU ls
по-разному в соответствии с результатом проверки.
"$@"
будут заменены опциями командной строки и операндами исходной командной строки.
Нам нужно использовать command ls
, а не просто ls
в функции, чтобы обойти поиск функции оболочки для ls
(который в противном случае дал бы нам красивую бесконечную рекурсию).
Обратите внимание, что эта функция не будет использовать шаблон игнорирования при выполнении ls /
из другого места, и что она будет использовать шаблон игнорирования при выполнении, например, ls /home/dvoo
из /
.
Чтобы было легче вспомнить, что это на самом деле делает (через полгода, когда вам станет интересно, что это делает), используйте длинные опции:
ls () {
case "$PWD" in
/) command ls --ignore='test' "$@" ;;
*) command ls "$@" ;;
esac
}
Альтернативная реализация вышеприведенной функции, которая будет вызывать ls
только из одного места (и которая короче):
ls () {
[ "$PWD" = "/" ] && set -- --ignore='test' "$@"
command ls "$@"
}