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

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

gnome-screensaver
gnome-screensaver-command --lock

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

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

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

Ответ 1

Try:

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

или

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

в вашем .bashrc

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

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

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

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

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

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

Ответ 4

Не работает ли это?

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

Ответ 5

Это приведет к выполнению двух команд один за другим:

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

Ответ 6

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

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

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

Ответ 7

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

alias doSomething='command1; command2'

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

doSomething() {
    command1
    command2 --lock
}

Ответ 8

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

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

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