Wiele poleceń w aliasie bash

210

Chciałbym zdefiniować alias, który uruchamia następujące dwa polecenia kolejno.

gnome-screensaver
gnome-screensaver-command --lock

W tej chwili dodałem

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

do mojego .bashrc, ale ponieważ tak często blokuję stację roboczą, łatwiej byłoby po prostu wpisać jedno polecenie.

Juriel
źródło

Odpowiedzi:

390

Próbować:

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

lub

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

w twoim .bashrc

Drugie rozwiązanie pozwala na użycie argumentów.

mouviciel
źródło
7
nie powinno to być „function lock () {blah}”?
szmaragdowa
2
Jak przekazać argument? Zagnieżdżanie zmiennej „msg” w lock()nawiasach daje błąd msg'' syntax error near unexpected token ..
geotheory
8
Po zdefiniowaniu funkcja zachowuje się jak polecenie: argumenty znajdują się w wierszu poleceń, oddzielone białymi spacjami. Na części deklaracji, argumenty są $1, $2... w ciele funkcji.
mouviciel
1
Głosuj za nie uwzględnianie linii aliasu dla params.
Philip Rego,
2
@PililRego - chętnie się od Ciebie nauczę i poprę odpowiedź.
mouviciel
79

Inne odpowiedzi odpowiednio odpowiadają na pytanie, ale twój przykład wygląda na to, że drugie polecenie zależy od pomyślnego wyjścia pierwszego. Możesz spróbować sprawdzić zwarcie w swoim aliasie:

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

Teraz drugie polecenie nie będzie nawet podejmowane, dopóki pierwsze nie powiedzie się. Lepszy opis oceny zwarcia opisano w tym pytaniu SO .

gpojd
źródło
5
Niespodziewanie, próbowałem z git fetch && git pull origin masteri nie działa na mnie aż wymieniłem &&z ;.
hakunin
3
Prawdopodobnie dlatego, że git fetch zwróciło coś innego niż 0?
RobAu
Pomógł! Praca dla mnie na Xubuntu 16.04.3
Fernando León
Głosuj za nie uwzględnianie linii aliasu dla params.
Philip Rego,
18

Aliasy służą do aliasingu nazw poleceń. Cokolwiek poza tym powinno być zrobione z funkcjami.

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

Aliasy to nazwy, które są nadal powiązane z pierwotną nazwą. lljest tylko nieco specyficznym rodzajem ls.

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

Funkcja to nowe polecenie o wewnętrznej logice. To nie jest po prostu zmiana nazwy innego polecenia. Wykonuje operacje wewnętrzne.

Technicznie aliasy w języku powłoki Bash mają tak ograniczone możliwości, że są wyjątkowo nieodpowiednie dla wszystkiego, co wymaga więcej niż jednego polecenia . Użyj ich do stworzenia małej mutacji pojedynczego polecenia, nic więcej.

Ponieważ intencją jest utworzenie nowego polecenia, które wykona operację, która wewnętrznie rozwiąże inne polecenia, jedyną prawidłową odpowiedzią jest użycie funkcji tutaj:

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

Użycie aliasów w takim scenariuszu napotyka wiele problemów. W przeciwieństwie do funkcji wykonywanych jako polecenia, aliasy są rozszerzane na bieżące polecenie, co doprowadzi do bardzo nieoczekiwanych problemów podczas łączenia tego polecenia „alias” z innymi poleceniami. Nie działają również w skryptach.

lhunath
źródło
Byłoby najlepiej, gdybyś mógł podać dowolny przykład z odpowiedzią. czekam na aktualizację.
Sajid Ali,
1
Głosuj za nie uwzględnianie linii aliasu dla params.
Philip Rego
2
Aliasy @PililRego nie przyjmują parametrów. Nie obniżaj głosu jabłka za to, że nie jest pomarańczowe. Zamiast tego jedz pomarańczę. Jak odpowiedź wyjaśnia bardzo dobrze, właściwym narzędziem tutaj nie są aliasy, ale funkcje.
lhunath,
Mam na myśli takie parametry. Użyłem źle zagnieżdżonych cudzysłowów. alias = "git commit -m 'init'; git push; git status"
Philip Rego
@PhilipRego Naprawdę musisz użyć funkcji, a nie aliasu. gps() { git commit -m 'init '; git push; git status; } Jak wyjaśniono, aliasy są bardzo ograniczone, delikatne, a ich jedyną intencją jest zmiana nazwy poleceń. Nadużywanie ich do niezwiązanych celów spowoduje, że wylądujesz w gorącej wodzie, takiej jak właśnie doświadczyłeś.
lhunath,
11

Czy to nie działa?

alias whatever='gnome-screensaver ; gnome-screensaver-command --lock'
Sean Bright
źródło
4

Spowodowałoby to uruchomienie dwóch poleceń jeden po drugim:

alias lock='gnome-screensaver ; gnome-screensaver-command --lock'
Adnan
źródło
1

Więc użyj średnika:

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

Nie działa to dobrze, jeśli chcesz podać argumenty do pierwszego polecenia. Alternatywnie, stwórz trywialny skrypt w katalogu $ HOME / bin.

Jonathan Leffler
źródło
0

Dodając moje 2 centy do 11-letniej dyskusji, spróbuj:

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

Neenus
źródło
0

Dodaj tę funkcję do ~/.bashrci uruchom ponownie terminal lub uruchomsource ~/.bashrc

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

W ten sposób te dwa polecenia będą uruchamiane przy każdym wejściu lockdo terminala.

W twoim konkretnym przypadku tworzenie aliasmoże działać, ale nie polecam tego. Intuicyjnie uważalibyśmy, że wartość aliasu byłaby taka sama, jakbyś wprowadził wartość w terminalu. Jednak tak nie jest:

Zasady dotyczące definiowania i używania aliasów są nieco mylące.

i

W prawie każdym celu funkcje powłoki są lepsze niż aliasy.

Więc nie używaj aliasu, chyba że musisz. https://ss64.com/bash/alias.html

Philip Rego
źródło
-3

Wystąpił problem, gdy zadeklarowałem pseudonimy ~/.bashrc. Mój terminal nie rozpoznał aliasów, które zadeklarowałem ~/.bashrc. Na podstawie artykułu (załączonego na dole) dowiedziałem się, że Mac OS X działa login-shelldomyślnie, dlatego ~/.bash_profilezamiast niego wywołuje ~/.bashrc.

Jeśli napotkasz ten sam problem podczas deklarowania swoich aliasów, możesz skorzystać z następującego łącza, aby rozwiązać problem:

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

ToleLee
źródło
Ta kontrola jakości dotyczy wielu poleceń w aliasie, a nie gdzie umieścić aliasy.
facuq
Zawsze wykonuję source .bashrcpo zapisaniu zmian w pliku, aby umożliwić rozpoznanie aliasu bez wylogowania.
Scott Fleming