Bash: пробелы в псевдониме

117

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

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

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

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

sixtyfootersdude
источник
8
Почему бы не сделатьalias lsm='ls -la | more'
Nifle

Ответы:

126

Документация 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
Деннис Уильямсон
источник
1
зачем вам использовать двойные скобки внутри оператора if?
sixtyfootersdude
1
@sixtyfootersdude: форма с двумя скобками более мощная, и я использую ее по привычке. См. Mywiki.wooledge.org/BashFAQ/031
Деннис Уильямсон
Итак, какова последняя команда? псевдоним ls = 'ls ()' ??
Jeef
1
@Jeef: нет, мой ответ использует функцию вместо псевдонима. Я отредактировал это, чтобы попытаться сделать это более ясным.
Деннис Уильямсон
6
@merlinpatt: commandпредотвращает рекурсивный вызов функции.
Деннис Уильямсон
53

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

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

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

heavyd
источник
8
+1 За объяснение, почему мне не разрешено использовать ls -la в качестве псевдонима.
sixtyfootersdude
7
Это было полезно, потому что вместо того, чтобы попытаться решить проблему, он ответил на вопрос. Я пришел сюда, потому что хотел создать псевдоним с пробелом, а этого просто не произойдет.
angryundead
Это не только ответило на мой вопрос, но и дало мне ценную информацию о том, как на самом деле работает механизм наложения имен. Ваша цитата из справочной страницы была весьма полезной.
Лили Финли
14

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

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

ld_pvl
источник
2
Как это справится, если я хочу ls -latбыть исключенным из этого лечения? Я должен был бы поместить случай, чтобы обращаться с этим выше -la*входа, да?
Стивен Лу
-1

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

Чарльз Стюарт
источник