Vários comandos em um alias para bash

211

Gostaria de definir um alias que execute os dois comandos a seguir consecutivamente.

gnome-screensaver
gnome-screensaver-command --lock

Agora eu adicionei

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

para o meu .bashrc, mas como bloqueio minha estação de trabalho com tanta frequência, seria mais fácil digitar apenas um comando.

yuriel
fonte

Respostas:

391

Experimentar:

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

ou

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

no seu .bashrc

A segunda solução permite que você use argumentos.

mouviciel
fonte
7
não deveria ser "function lock () {blah}"?
precisa saber é o seguinte
2
Como você passa a discussão? Variável de nidificação 'msg' dentro de lock()parênteses dá erro syntax error near unexpected token msg'` ..
geotheory
8
Uma vez definida, a função se comporta como um comando: os argumentos estão na linha de comandos, separados por espaços em branco. Na parte declaração, os argumentos são $1, $2... no corpo da função.
Mouviciel 25/03
1
Downvote por não incluir a linha de alias para com parâmetros.
Philip Rego
2
@ PhillipRego - Eu ficaria feliz em aprender com você e com a sua resposta positiva.
Mouviciel 20/06/19
79

As outras respostas respondem à pergunta adequadamente, mas seu exemplo parece que o segundo comando depende da saída do primeiro com êxito. Você pode tentar uma avaliação de curto-circuito em seu alias:

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

Agora, o segundo comando nem será tentado, a menos que o primeiro seja bem-sucedido. Uma descrição melhor da avaliação de curto-circuito é descrita nesta questão do SO .

gpojd
fonte
5
Surpreendentemente, tentei isso com git fetch && git pull origin mastere não funcionou para mim até que eu substituído &&com ;.
22414 ha hakunin
3
Provavelmente porque o git fetch retornou algo diferente de 0?
RobAu
Ajudado! Trabalho é para mim no Xubuntu 16.04.3
Fernando León
Downvote por não incluir a linha de alias para com parâmetros.
Philip Rego
18

Os aliases destinam-se ao alias dos nomes de comando. Qualquer coisa além disso deve ser feita com funções.

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

Aliases são nomes que ainda estão associados ao nome original. llé apenas um tipo ligeiramente específico de ls.

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

Uma função é um novo comando que possui lógica interna. Não é simplesmente uma renomeação de outro comando. Faz operações internas.

Tecnicamente, os aliases na linguagem shell Bash são tão limitados em recursos que são extremamente inadequados para qualquer coisa que envolva mais do que um único comando . Use-os para fazer uma pequena mutação de um único comando, nada mais.

Como a intenção é criar um novo comando que execute uma operação que internamente resolverá em outros comandos, a única resposta correta é usar uma função aqui:

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

O uso de aliases em um cenário como esse apresenta muitos problemas. Ao contrário das funções executadas como comandos, os alias são expandidos para o comando atual, o que levará a problemas muito inesperados ao combinar esse "comando" com outros comandos. Eles também não funcionam em scripts.

lhunath
fonte
Seria melhor se você desse algum exemplo com sua resposta. aguardando atualização.
precisa
1
Downvote por não incluir a linha de alias para com parâmetros.
Philip Rego
2
Os aliases do @PhilipRego não aceitam parâmetros. Não vote na maçã por não ser laranja. Coma uma laranja em vez disso. Como a resposta explica muito bem, a ferramenta correta aqui não é alias, mas funciona.
lhunath
Quero dizer parâmetros como este. Eu estava usando aspas aninhadas errado. alias = "git commit -m 'init'; git push; status git"
Philip Rego
@ PhilipRego Você realmente precisa usar uma função, não um apelido. gps() { git commit -m 'init '; git push; git status; } Como explicado, os aliases são extremamente limitados, frágeis e sua única intenção é renomear comandos. Abusá-los para fins não relacionados o levará a água quente, como você acabou de experimentar.
Lhunath
11

Isso não funciona?

alias whatever='gnome-screensaver ; gnome-screensaver-command --lock'
Sean Bright
fonte
4

Isso executaria os 2 comandos um após o outro:

alias lock='gnome-screensaver ; gnome-screensaver-command --lock'
Adnan
fonte
1

Então use um ponto-e-vírgula:

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

Isso não funciona bem se você deseja fornecer argumentos para o primeiro comando. Como alternativa, crie um script trivial no diretório $ HOME / bin.

Jonathan Leffler
fonte
0

Adicionando meus 2 centavos à discussão de 11 anos, tente o seguinte:

alias lock="gnome-screensaver \gnome-screensaver-command --lock"

Neenus
fonte
0

Adicione esta função ao seu ~/.bashrce reinicie seu terminal ou executesource ~/.bashrc

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

Dessa forma, esses dois comandos serão executados sempre que você entrar lockno seu terminal.

No seu caso específico, criar um aliaspode funcionar, mas eu não o recomendo. Intuitivamente, pensaríamos que o valor de um alias seria o mesmo que se você inserisse o valor no terminal. No entanto, esse não é o caso:

As regras relativas à definição e uso de aliases são um tanto confusas.

e

Para quase todos os propósitos, as funções de shell são preferidas aos aliases.

Portanto, não use um alias a menos que você precise. https://ss64.com/bash/alias.html

Philip Rego
fonte
-3

Eu tive um problema ao declarar aliases em ~/.bashrc. Meu terminal não reconheceu os apelidos que declarei ~/.bashrc. Aprendi com o artigo (anexado na parte inferior) que o Mac OS X é executado login-shellpor padrão, portanto, ele chama em ~/.bash_profilevez de ~/.bashrc.

Se você tiver o mesmo problema ao declarar seus aliases, consulte o seguinte link para resolver o problema:

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

ToleLee
fonte
Esse controle de qualidade é sobre vários comandos em um alias, não onde colocar os alias.
facuq
Sempre realizo source .bashrcapós salvar as alterações no arquivo, para permitir que o alias seja reconhecido sem fazer logout.
Scott Fleming