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


117

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

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

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

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


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 )


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


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

-1

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.