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