Только если в «/»: alias ls = 'ls -I test'?

konsole поддерживает это как встроенный, НО в других эмуляторах терминала вам нужно установить BiCon (двунаправленная консоль).

6
02.03.2017, 12:45
3 ответа

Что-то вроде этого, я думал, это сработает:

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.

10
27.01.2020, 20:20

Используйте функцию, которая проверяет, находитесь ли вы в / для ls :

ls () {
    if [[ "$PWD" == / ]]
    then
        command ls -I test "$@"
    else
        command ls "$@"
    fi
}

Таким образом, любые аргументы, переданные в ls по-прежнему будет использоваться.

Или:

ls () {
    if [ "$PWD" == / ]
    then
        set -- -I test "$@"
    fi
    command ls "$@"
}
22
27.01.2020, 20:20
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 "$@"
}
34
27.01.2020, 20:20

Теги

Похожие вопросы