Bash: простори в псевдонімі


116

Я намагаюся створити псевдоніми в баші. Те , що я хочу зробити , це карта ls -laдляls -la | more

У моєму файлі .bashrc ось що я спробував:

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

Однак це не працює, тому що (я припускаю) він має пробіли в імені псевдоніма. Чи є для цього робота?


8
Чому б не зробитиalias lsm='ls -la | more'
Nifle

Відповіді:


125

Документація 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?
шістдесят футів

1
@sixtyfootersdude: Форма подвійної дужки є більш потужною, і я використовую її за звичкою. Дивіться mywiki.wooledge.org/BashFAQ/031
Денніс Вільямсон

Отже, яка фінальна команда? псевдонім ls = 'ls ()' ??
Jeef

1
@Jeef: Ні, моя відповідь використовує функцію замість псевдоніму. Я відредагував це, щоб спробувати зробити його більш зрозумілим.
Денніс Вільямсон

6
@merlinpatt: commandзапобігає рекурсивному виклику функції.
Денніс Вільямсон

53

На сторінці псевдоніма man :

Перше слово кожної простої команди, якщо не цитується, перевіряється, чи є у неї псевдонім. Якщо так, це слово замінюється текстом псевдоніма. Псевдонім ім'я та текст заміни можуть містити будь-які дійсні введення оболонки, включаючи метахарактори оболонки, за винятком того, що ім'я псевдоніма може не містити `= '.

Отже, лише перше слово перевіряється на відповідність псевдоніму, що робить багатословним псевдонім неможливим. Можливо, ви зможете написати скрипт оболонки, який перевіряє аргументи та викликає вашу команду, якщо вони збігаються, а в іншому випадку просто називають нормальне ls(див. Відповідь Деніса Вільямсона )


8
+1 Для пояснення, чому мені не дозволяється використовувати ls -la як псевдонім.
шістдесят футів

7
Це було корисно, оскільки замість того, щоб намагатися вирішити це, воно відповіло на питання. Я прийшов сюди, тому що хотів створити псевдонім із пробілом у ньому, і цього просто не станеться.
goldenundead

Це не тільки відповіло на моє запитання, але й дало мені цінне розуміння того, як насправді працює механізм випромінювання. Ваша цитата зі сторінки man була дуже корисною.
Лілі Фінлі

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.