103

Я пытаюсь создать псевдонимы в Bash. То, что я хочу сделать, это сопоставить ls -la с ls -la | more

В моем файле .bashrc это то, что я пытался:

alias 'ls -la'='ls -la | more'

Однако это не работает, потому что (я предполагаю) у него есть пробелы в псевдониме. Есть ли обходной путь для этого?

4 ответа4

111

Документация Bash гласит:«Практически для любых целей функции оболочки предпочтительнее псевдонимов». Вот функция оболочки, которая заменяет ls и приводит к тому, что вывод передается в more если аргумент состоит из (только) -la .

ls() {
    if [[ $@ == "-la" ]]; then
        command ls -la | more
    else
        command ls "$@"
    fi
}

Как однострочник:

ls() { if [[ $@ == "-la" ]]; then command ls -la | more; else command ls "$@"; fi; }

Автоматически выводить трубу:

ls -la
48

Из справочной страницы псевдонима:

Первое слово каждой простой команды, если оно не заключено в кавычки, проверяется на наличие псевдонима. Если это так, это слово заменяется текстом псевдонима. Имя псевдонима и текст замены могут содержать любые допустимые входные данные оболочки, включая метасимволы оболочки, за исключением того, что имя псевдонима может не содержать `= '.

Таким образом, только первое слово проверяется на совпадения псевдонимов, что делает невозможным псевдонимы из нескольких слов. Вы можете написать сценарий оболочки, который проверяет аргументы и вызывает вашу команду, если они совпадают, а в противном случае просто вызывает обычный ls (см. Ответ @Dennis Williamson)

13

Немного улучшенный подход, взятый из ответа Денниса:

function ls() {
  case $* in
    -la* ) shift 1; command ls -la "$@" | more ;;
    * ) command ls "$@" ;;
  esac
}

Или однострочник:

function ls() { case $* in -la* ) shift 1; command ls -la "$@" | more ;; * ) command ls "$@" ;; esac }

Это позволяет добавлять дополнительные параметры / аргументы после команды, если это необходимо, например, ls -la -h

-2

Вы можете вызвать этот псевдоним еще, но вам нужна цитата, чтобы пробел был частью командного слова. Таким образом, "ls -la" -p pattern передаст параметр -p pattern more , а не ls .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .