Comandi multipli in un alias per bash


211

Vorrei definire un alias che esegue consecutivamente i seguenti due comandi.

gnome-screensaver
gnome-screensaver-command --lock

In questo momento ho aggiunto

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

al mio .bashrc ma dato che blocco così spesso la mia workstation, sarebbe più semplice digitare un solo comando.

Risposte:


391

Provare:

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

o

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

nel tuo .bashrc

La seconda soluzione consente di utilizzare gli argomenti.


7
non dovrebbe essere "function lock () {blah}"?
emeraldjava,

2
Come si passa l'argomento? La variabile di nidificazione 'msg' tra lock()parentesi genera un errore syntax error near unexpected token msg'` ..
geotheory

8
Una volta definita la funzione, si comporta come un comando: gli argomenti si trovano sulla riga di comando, separati da spazi bianchi. Nella parte di dichiarazione, gli argomenti sono $1, $2... nel corpo della funzione.
mouviciel,

1
Downvote per non includere la linea alias per con i parametri.
Philip Rego,

2
@PhilipRego - Sarei felice di imparare da te e dare il tuo voto.
mouviciel,

79

Le altre risposte rispondono adeguatamente alla domanda, ma il tuo esempio sembra che il secondo comando dipenda dal fatto che il primo sia uscito correttamente. Puoi provare una valutazione di corto circuito nel tuo alias:

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

Ora il secondo comando non verrà nemmeno tentato a meno che il primo non abbia esito positivo. Una migliore descrizione della valutazione del corto circuito è descritta in questa domanda SO .


5
Sorprendentemente, provato questo con git fetch && git pull origin mastere non ha funzionato per me fino a quando ho sostituito &&con ;.
Hakunin,

3
Probabilmente perché git fetch ha restituito qualcosa di diverso da 0?
RobAu,

Aiutato! Lavora con me su Xubuntu 16.04.3
Fernando León,

Downvote per non includere la linea alias per con i parametri.
Philip Rego,

18

Gli alias sono pensati per aliasare i nomi dei comandi. Tutto ciò che va oltre dovrebbe essere fatto con funzioni.

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

Gli alias sono nomi che sono ancora associati al nome originale. llè solo un tipo leggermente specifico di ls.

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

Una funzione è un nuovo comando che ha una logica interna. Non è semplicemente la ridenominazione di un altro comando. Fa operazioni interne.

Tecnicamente, gli alias nel linguaggio shell Bash sono così limitati nelle capacità che sono estremamente inadatti a tutto ciò che coinvolge più di un singolo comando . Usali per fare una piccola mutazione di un singolo comando, niente di più.

Poiché l'intenzione è quella di creare un nuovo comando che esegua un'operazione che verrà risolta internamente in altri comandi, l'unica risposta corretta è utilizzare una funzione qui:

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

L'uso di alias in uno scenario come questo si imbatte in molti problemi. Contrariamente alle funzioni, che vengono eseguite come comandi, gli alias vengono espansi nel comando corrente, il che porterà a problemi molto imprevisti quando si combina questo alias "comando" con altri comandi. Inoltre non funzionano negli script.


Sarebbe meglio se potessi fornire qualche esempio con la tua risposta. in attesa di aggiornamento.
Sajid Ali,

1
Downvote per non includere la linea alias per con i parametri.
Philip Rego,

2
Gli alias @PhilipRego non accettano parametri. Non sottovalutare la mela per non essere arancione. Mangia un'arancia invece. Come la risposta spiega molto bene, lo strumento giusto qui non è alias ma funzioni.
lhunath,

Intendo parametri come questo. Stavo usando le virgolette nidificate sbagliate. alias = "git commit -m 'init'; git push; git status"
Philip Rego,

@PhilipRego Devi davvero usare una funzione, non un alias. gps() { git commit -m 'init '; git push; git status; } Come spiegato, gli alias sono estremamente limitati, fragili e la loro unica intenzione è quella di rinominare i comandi. Abusarli per scopi non correlati ti farà atterrare in acqua calda, come hai appena sperimentato.
lhunath,

11

Questo non funziona?

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

4

Ciò eseguirà i 2 comandi uno dopo l'altro:

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

1

Quindi usa un punto e virgola:

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

Questo non funziona bene se si desidera fornire argomenti al primo comando. In alternativa, crea uno script banale nella tua directory $ HOME / bin.


0

Aggiungendo i miei 2 centesimi alla discussione di 11 anni prova questo:

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


0

Aggiungi questa funzione al tuo ~/.bashrce riavvia il terminale o eseguisource ~/.bashrc

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

In questo modo questi due comandi verranno eseguiti ogni volta che si entra locknel terminale.

Nel tuo caso specifico la creazione di un aliaspotrebbe funzionare, ma non lo consiglio. Intuitivamente pensiamo che il valore di un alias verrebbe eseguito come se immettessi il valore nel terminale. Tuttavia non è così:

Le regole relative alla definizione e all'uso degli alias sono alquanto confuse.

e

Per quasi tutti gli scopi, le funzioni di shell sono preferite rispetto agli alias.

Quindi non usare un alias a meno che non sia necessario. https://ss64.com/bash/alias.html


-3

Ho riscontrato un problema durante la dichiarazione di alias in ~/.bashrc. Il mio terminale non ha riconosciuto gli alias in cui ho dichiarato ~/.bashrc. Dall'articolo (allegato in basso) ho appreso che Mac OS X funziona login-shelldi default, quindi chiama ~/.bash_profileinvece di~/.bashrc .

Se dovessi riscontrare lo stesso problema nel dichiarare i tuoi alias, puoi fare riferimento al seguente link per risolvere il problema:

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


Questo QA riguarda più comandi in un alias, non dove inserire gli alias.
facuq,

Eseguo sempre source .bashrcdopo aver salvato le modifiche al file, per consentire alias di essere riconosciuto senza disconnettersi.
Scott Fleming,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.