Несколько команд в псевдониме для Bash - PullRequest
171 голосов
/ 16 апреля 2009

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

gnome-screensaver
gnome-screensaver-command --lock

Сейчас я добавил

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

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

Ответы [ 8 ]

336 голосов
/ 16 апреля 2009

Попробуйте:

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

или

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

в вашем .bashrc

Второе решение позволяет использовать аргументы.

66 голосов
/ 17 апреля 2009

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

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

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

15 голосов
/ 16 апреля 2009

Псевдонимы предназначены для псевдонимов имен команд. Все, что за этим следует делать с функциями.

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
}

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

12 голосов
/ 16 апреля 2009

Разве это не работает?

alias whatever='gnome-screensaver ; gnome-screensaver-command --lock'
4 голосов
/ 16 апреля 2009

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

alias lock='gnome-screensaver ; gnome-screensaver-command --lock'
2 голосов
/ 16 апреля 2009

Так что используйте точку с запятой:

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

Это не работает, если вы хотите предоставить аргументы для первой команды. В качестве альтернативы создайте простой скрипт в каталоге $ HOME / bin.

1 голос
/ 28 января 2019

Я второй подход @mouviciel. Использование следующих команд довольно хорошо работает для простых команд:

alias doSomething='command1; command2'

Для команд, требующих аргументов, просто используйте функции:

doSomething() {
    command1
    command2 --lock
}
0 голосов
/ 21 января 2017

У меня возникла проблема при объявлении псевдонимов в ~/.bashrc. Мой терминал не распознал псевдонимы, которые я объявил в ~/.bashrc. Из статьи (прикрепленной внизу) я узнал, что Mac OS X по умолчанию запускает login-shell, следовательно, она вызывает ~/.bash_profile вместо ~/.bashrc.

Если при объявлении псевдонимов вы столкнулись с той же проблемой, вы можете обратиться к следующей ссылке для решения проблемы:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...