Документация 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
Первое слово каждой простой команды, если оно не заключено в кавычки, проверяется на наличие псевдонима. Если это так, это слово заменяется текстом псевдонима. Имя псевдонима и текст замены могут содержать любые допустимые входные данные оболочки, включая метасимволы оболочки, за исключением того, что имя псевдонима может не содержать `= '.
Таким образом, только первое слово проверяется на совпадения псевдонимов, что делает невозможным псевдонимы из нескольких слов. Вы можете написать сценарий оболочки, который проверяет аргументы и вызывает вашу команду, если они совпадают, а в противном случае просто вызывает нормальный 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.