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


133

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

gnome-screensaver 
gnome-screensaver-command --lock 

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

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

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

260

Try:

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

или

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

в вашем .bashrc

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

+5

не следует, что быть «функция блокировки() {} бла» ? 14 янв. 102010-01-14 12:12:53

+7

Я использую синтаксис 'sh', который также работает с' bash'. 14 янв. 102010-01-14 13:54:55

+2

Как вы передаете аргумент? Вложенная переменная 'msg' внутри 'lock()' скобки дает ошибку 'синтаксическая ошибка около неожиданного токена' msg'' .. 25 мар. 142014-03-25 14:57:54

+6

Как только функция определена, она ведет себя как команда: аргументы находятся в командной строке, разделенные пробелами , В части объявления аргументы: '$ 1',' $ 2' ... в теле функции. 25 мар. 142014-03-25 15:17:23

  0

спасибо за упоминание многострочной функции 13 июл. 142014-07-13 07:58:30


11

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

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

4

Это управлял бы 2 команды один за другим:

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

2

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

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

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


9

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

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 
} 

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

  0

Было бы лучше, если бы вы могли предоставить любой пример с вашим ответом. ожидая обновления. 15 ноя. 172017-11-15 14:40:00


56

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

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

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

+4

Удивительно, попробовал это с помощью 'git fetch && git pull origin master' и не работал для меня, пока не заменил' && 'на'; '. 25 фев. 142014-02-25 09:42:00

+3

Возможно, потому что git fetch вернул что-то еще, кроме 0? 12 фев. 152015-02-12 09:53:14

  0

Помогли! Работа для меня на Xubuntu 16.04.3 09 янв. 182018-01-09 12:16:54


0

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

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

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