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

53752
sixtyfootersdude

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

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

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

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

100
Почему бы не сделать `alias lsm = 'ls -la | more'` Nifle 14 лет назад 8

4 ответа на вопрос

106
Dennis Williamson

Документация 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 
зачем вам использовать двойные скобки внутри оператора if? sixtyfootersdude 14 лет назад 1
@sixtyfootersdude: форма двойных скобок более мощная, и я использую ее по привычке. Смотрите http://mywiki.wooledge.org/BashFAQ/031 Dennis Williamson 14 лет назад 0
Итак, какова последняя команда? псевдоним ls = 'ls ()' ?? Jeef 9 лет назад 0
@Jeef: Нет, мой ответ использует функцию * вместо * псевдонима. Я отредактировал это, чтобы попытаться сделать это более ясным. Dennis Williamson 9 лет назад 1
Что здесь за команда? Почему бы просто не `ls -la | more` или `ls" $ @ "`? merlinpatt 8 лет назад 0
@merlinpatt: `command` предотвращает рекурсивный вызов функции. Dennis Williamson 8 лет назад 6
Очень полезно, я хотел использовать псевдоним, чтобы заменить git push на поведение, которое изменилось бы, когда git push вызывался из разных каталогов. Если вы поместите функцию в .bash_aliases, ее можно будет использовать из вашей пользовательской папки и подпапки, как и псевдоним. Simonlbc 8 лет назад 0
@Simonlbc: обратите внимание, что `.bash_aliases`, скорее всего, является дистрибутивом или локально определенной функцией, а не функцией Bash по умолчанию. Dennis Williamson 8 лет назад 0
@Simonlbc Вместо изменения текущего поведения `git push`, я бы предложил создать новый [Git Alias] (https://git-scm.com/book/tr/v2/Git-Basics-Git-Aliases), например `git my-push`. Franklin Yu 8 лет назад 0
@FranklinYu почему? Simonlbc 8 лет назад 0
@Simonlbc Чтобы убедиться, что учебники онлайн будут работать в моей среде. Может быть, больше личного выбора. Franklin Yu 8 лет назад 0
Будьте осторожны, когда называете функцию, которая не конфликтует с функцией `bash-complete` (команда autocomplete). Я потратил немного времени на устранение неполадок с `tmux`, создав функцию` _tmux` для псевдонима команды, но обнаружил, что `bash-complete` для` tmux` также использует `_tmux` для управления автозаполнением. Итак, вместо этого я создал функцию `_TMUX`. palswim 6 лет назад 0
46
heavyd

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

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

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

+1 За объяснение, почему мне не разрешено использовать ls -la в качестве псевдонима. sixtyfootersdude 14 лет назад 6
Это было полезно, потому что вместо того, чтобы пытаться решить его, он ответил на вопрос. Я пришел сюда, потому что хотел создать псевдоним с пробелом, а этого просто не произойдет. angryundead 10 лет назад 6
13
ld_pvl

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

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

Как это происходит, если я хочу, чтобы `ls -lat` был исключен из этого обращения? Мне нужно поместить регистр для обработки над записью `-la *`, да? Steven Lu 10 лет назад 2
-2
Charles Stewart

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

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