Несколько команд в псевдониме для Bash


211

Я хотел бы определить псевдоним, который запускает следующие две команды последовательно.

gnome-screensaver
gnome-screensaver-command --lock

Прямо сейчас я добавил

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

на мой .bashrc, но так как я часто блокирую свою рабочую станцию, было бы проще просто набрать одну команду.

Ответы:


391

Пытаться:

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 для не включающей псевдоним строки с params.
Филипп Рего

2
@PhilipRego - Я был бы рад узнать от вас и поддержать ваш ответ.
mouviciel

79

Другие ответы адекватно отвечают на вопрос, но ваш пример выглядит так, как будто вторая команда зависит от успешного выхода первой команды. Вы можете попробовать оценку короткого замыкания в своем псевдониме:

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

Теперь вторая команда даже не будет предпринята, пока первая команда не будет успешной. Лучшее описание оценки короткого замыкания описано в этом вопросе SO .


5
Удивительно, но попробовал это с git fetch && git pull origin masterи не работал для меня, пока я не заменил &&на ;.
Хакунин

3
Возможно, потому что git fetch вернул что-то еще, кроме 0?
RobAu

Помогал! Работа для меня на Xubuntu 16.04.3
Фернандо Леон

Downvote для не включающей псевдоним строки с params.
Филипп Рего

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
}

Функция - это новая команда с внутренней логикой. Это не просто переименование другой команды. Это делает внутренние операции.

Технически, псевдонимы в языке оболочки Bash настолько ограничены в возможностях, что крайне плохо подходят для всего, что включает в себя более одной команды . Используйте их для создания небольшой мутации одной команды, не более того.

Поскольку намерение состоит в том, чтобы создать новую команду, которая выполняет операцию, которая будет внутренне разрешаться в других командах, единственный правильный ответ - использовать здесь функцию:

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

Использование псевдонимов в подобном сценарии сталкивается с множеством проблем. В отличие от функций, которые выполняются как команды, псевдонимы расширяются до текущей команды, что приведет к очень неожиданным проблемам при объединении этого псевдонима «команда» с другими командами. Они также не работают в сценариях.


Было бы лучше, если бы вы могли привести любой пример с вашим ответом. жду обновления.
Саджид Али

1
Downvote для не включающей псевдоним строки с params.
Филипп Рего

2
Псевдонимы @PhilipRego не принимают параметров. Не понижайте голос яблока за то, что он не оранжевый. Ешьте апельсин вместо этого. Как хорошо объясняется в ответе, правильный инструмент здесь - это не псевдонимы, а функции.
lhunath

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

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


4

Это будет запускать 2 команды одну за другой:

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.