Кілька команд у псевдонімі для 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.