Кілька команд у псевдонімі для bash


210

Я хотів би визначити псевдонім, який виконує наступні дві команди послідовно.

gnome-screensaver
gnome-screensaver-command --lock

Зараз я додав

alias lock='gnome-screensaver-command --lock'

до мого .bashrc, але так як я заблокував свою робочу станцію так часто, було б простіше просто ввести одну команду.

Відповіді:


390

Спробуйте:

alias lock='gnome-screensaver; gnome-screensaver-command --lock'

або

lock() {
    gnome-screensaver
    gnome-screensaver-command --lock
}

у вашому .bashrc

Друге рішення дозволяє використовувати аргументи.


7
чи не повинно це бути "function lock () {blah}"?
— смарагдзава

2
Як ви передаєте аргумент? Вбудована змінна 'msg' у lock()дужках дає помилку syntax error near unexpected token msg'` ..
— geotheory

8
Після того, як функція була визначена, вона поводиться як команда: аргументи знаходяться в командному рядку, розділені пробілами. У частині декларації аргументи є $1, $2... у функціональному органі.
— mouviciel

1
Downvote для не включення псевдоніму для парами.
— Філіп Рего

2
@PhilipRego - Я був би радий дізнатися у вас і підтримати вашу відповідь.
— mouviciel

79

Інші відповіді відповідають на питання адекватно, але ваш приклад виглядає так, що друга команда залежить від того, що перша успішно закінчується. Ви можете спробувати оцінку короткого замикання у своєму псевдонімі:

alias lock='gnome-screensaver && gnome-screensaver-command --lock'

Тепер другу команду навіть не буде здійснено, якщо перша не буде успішною. Кращий опис оцінки короткого замикання описаний у цьому запитанні щодо ПЗ .


5
Дивно, але спробував це git fetch && git pull origin masterі не працював для мене, поки не замінив&& з ;.
— хакунін

3
Можливо, тому, що git fetch повернув щось інше, ніж 0?
— RobAu

Допомогли! Робота для мене на Xubuntu 16.04.3
— Фернандо Леон

Downvote для не включення псевдоніму для парами.
— Філіп Рего

18

Псевдоніми призначені для зведення імен команд. Все, що перевищує це, слід робити за допомогою функцій.

alias ll='ls -l' # The ll command is an alias for ls -l

Псевдоніми - це імена, які все ще пов'язані з оригінальною назвою. llце лише трохи специфічний вид ls.

d() {
    if exists colordiff; then
        colordiff -ur "$@"
    elif exists diff; then
        diff -ur "$@"
    elif exists comm; then
        comm -3 "$1" "$2"
    fi | less
}

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

Технічно псевдоніми в мові оболонки Баша настільки обмежені у можливостях, що вони надзвичайно погано підходять для всього, що передбачає більш ніж одну команду . Використовуйте їх для створення невеликої мутації однієї команди, не більше того.

Оскільки наміром є створення нової команди, яка виконує операцію, яка внутрішньо буде вирішуватися в інших командах, єдиний правильний відповідь - використовувати тут функцію:

lock() {
    gnome-screensaver
    gnome-screensaver-command --lock
}

Використання псевдонімів у подібному сценарії стикається з багатьма проблемами. На відміну від функцій, які виконуються як команди, псевдоніми розширюються в поточну команду, що призведе до дуже несподіваних проблем при поєднанні цього псевдоніма "команда" з іншими командами. Вони також не працюють в сценаріях.


Було б найкраще, якби ви могли надати будь-який приклад зі своєю відповіддю. чекаю оновлення.
— Садід Алі

1
Downvote для не включення псевдоніму для парами.
— Філіп Рего

2
Псевдоніми @PhilipRego не приймають параметри. Не голосуйте яблуко за те, що воно не помаранчеве. Їжте замість цього апельсин. Як відповідь дуже добре пояснює, правильний інструмент тут не псевдоніми, а функції.
— lhunath

Я маю на увазі такі параметри. Я неправильно використовував вкладені цитати. alias = "git commit -m 'init'; git push; git status"
— Філіп Рего

@PhilipRego Вам дійсно потрібно використовувати функцію, а не псевдонім. gps() { git commit -m 'init '; git push; git status; } Як було пояснено, псевдоніми є надзвичайно обмеженими, неміцними, і їх єдиним наміром є перейменування команд. Зловживання ними для споріднених цілей висадить вас у гарячу воду, таку, яку ви пережили.
— lhunath


4

Це запустить дві команди одна за одною:

alias lock='gnome-screensaver ; gnome-screensaver-command --lock'

1

Тож використовуйте напівколонку:

alias lock='gnome-screensaver; gnome-screen-saver-command --lock'

Це не працює добре, якщо ви хочете подати аргументи до першої команди. Крім того, створіть тривіальний скрипт у каталозі $ HOME / bin.


0

Додавши мої 2 центи до 11-річної дискусії, спробуйте це:

alias lock="gnome-screensaver \gnome-screensaver-command --lock"


0

Додайте цю функцію до свого ~/.bashrcі перезапустіть термінал або запустітьsource ~/.bashrc

function lock() {
    gnome-screensaver
    gnome-screensaver-command --lock
}

Таким чином ці дві команди будуть виконуватися кожного разу, коли ви введете lock у свій термінал.

У вашому конкретному випадку створення aliasможливо може спрацювати, але я не рекомендую його. Інтуїтивно ми думаємо, що значення псевдоніму буде таким же, як якщо б ви ввели значення в терміналі. Однак це не так:

Правила щодо визначення та використання псевдонімів дещо заплутані.

і

Практично з будь-якою метою функції оболонки віддають перевагу псевдонімам.

Тому не використовуйте псевдонім, якщо не потрібно. https://ss64.com/bash/alias.html


-3

Я зіткнувся з проблемою, коли оголошував псевдоніми в ~/.bashrc. Мій термінал не розпізнав псевдоніми, про які я заявив ~/.bashrc. З статті (додається внизу) я дізнався, що Mac OS X працює login-shellза замовчуванням, отже, він викликає ~/.bash_profileзамість ~/.bashrc.

Якщо ви зіткнулися з тією ж проблемою, коли декларуєте свої псевдоніми, ви можете перейти до наступного посилання, щоб вирішити проблему:

http://www.joshstaiger.org/archives/2005/07/bash_profile_vs.html


Цей QA стосується декількох команд у псевдонімі, а не де розміщувати псевдоніми.
— facuq

Я завжди виконую source .bashrcпісля збереження змін у файлі, щоб дозволити розпізнавання псевдоніму без виходу з системи.
— Скотт Флемінг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.