leniwe podstawienie bashrc


10

Jak uzyskać ~/.bashrcaliasy do oceny $()podstawień w czasie wykonywania , zamiast w momencie wykonywania ~ / .bashrc (podczas otwierania terminala)?

Często uruchamiam to polecenie, aby dodać do niego alias:

svn diff -r $(svn info | grep ^Revision | awk {'print $2'}):HEAD $(svn info | grep ^URL | awk {'print $2'}) | colordiff

Jednak, gdy dodam go ~/.bashrcjako alias, widzę, że oceny są zakodowane na sztywno do wartości, które miały w momencie otwarcia terminalu:

$ alias
alias svnbranch='svn diff -r 178184:HEAD svn+ssh://branches/t4252 | colordiff'

Jeśli otworzę terminal, ~pojawią się błędy:

svn: E155007: '/home/dotancohen' is not a working copy
svn: E155007: '/home/dotancohen' is not a working copy
svn: E155007: '/home/dotancohen' is not a working copy
svn: E155007: '/home/dotancohen' is not a working copy
$ alias
alias svnbranch='svn diff -r :HEAD  | colordiff'
$

Wypróbowałem te dwie odmiany aliasu ~/.bashrc, oba mają taki sam efekt (jak się spodziewałem):

alias svnbranch="svn diff -r $(svn info | grep ^Revision | awk {'print $2'}):HEAD $(svn info | grep ^URL | awk {'print $2'}) | colordiff"
alias svnbranch="svn diff -r `svn info | grep ^Revision | awk {'print $2'}`:HEAD `svn info | grep ^URL | awk {'print $2'}` | colordiff"

Jak uzyskać ~/.bashrcaliasy do oceny $()podstawień w czasie wykonywania ?

Dodatkowo, jak szukać tej sytuacji w Google? Próbowałem google na „podstawienie bashrc”, „leniwe podstawienie bashrc” i inne kluczowe frazy, ale nie znalazłem niczego, co według mnie powinno być na tyle częstym problemem, by znaleźć informacje.


2
Dlaczego to musi być pseudonim? Przenieś go do skryptu powłoki i gotowe. Większość systemów typu * ix jest obecnie umieszczanych $HOME/binw katalogu, PATHjeśli masz taki katalog.
Warren Young,

@WarrenYoung: Masz rację, ta konkretna instancja może być skryptem. Jednak nadal chciałbym znać odpowiedź, ponieważ wolę aliasy dla innych rzeczy i na pewno się na to natknę. Mógłbym uogólnić twoje pytanie na „dlaczego Bash obsługuje aliasy, skoro wszystko może być skryptem”.
dotancohen

Dlaczego głosowanie negatywne? Jak mogę poprawić pytanie? Podałem przykłady, nieudane próby, a nawet frazy, na których próbowałem znaleźć google.
dotancohen

@dotancohen: Myślę, że powinieneś o to zapytać osobno. Dam częściową odpowiedź tutaj: alias cdp="cd ~/projects". Nie można tego zrobić w skrypcie powłoki.
Warren Young,

Odpowiedzi:


11

Użyj pojedynczych cudzysłowów, aby ukryć przetwarzanie znaków specjalnych. Można również interpretacja odwrotnego ukośnika na $ s.

W przypadku złożonego polecenia prawdopodobnie lepiej jest użyć funkcji w każdym przypadku, która nie wymaga ucieczki i jest łatwiejsza do odczytania i edycji:

svnbranch() {
    svn diff -r $(svn info | grep ^Revision | awk {'print $2'}):HEAD $(svn info | grep ^URL | awk {'print $2'}) | colordiff
}

Możesz zdefiniować funkcję w dowolnym miejscu, w którym możesz zdefiniować alias.


2
awkma również przestrzeń wzorów, awk '/^Revision/{ print ...}' więc nie ma potrzeby grep w tym przypadku.
Valentin Bajrami
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.