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.