bashrc sostituzione pigra


10

Come si ottengono gli ~/.bashrcalias per valutare le $()sostituzioni in fase di esecuzione , anziché nel momento in cui viene eseguito ~ / .bashrc (quando si apre un terminale)?

Eseguo questo comando abbastanza spesso che vorrei aggiungere un alias per esso:

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

Tuttavia, quando lo aggiungo ~/.bashrccome alias, vedo che le valutazioni sono codificate in base ai valori che avevano al momento in cui ho aperto il terminale:

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

Se apro un terminale ~allora ricevo errori:

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'
$

Ho provato queste due varianti dell'alias ~/.bashrc, entrambe hanno lo stesso effetto (come mi aspettavo):

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"

Come si ottengono gli ~/.bashrcalias per valutare le $()sostituzioni in fase di esecuzione ?

Inoltre, come si cercherebbe questa situazione su Google? Ho provato a cercare su Google "sostituzione bashrc", "sostituzione pigra bashrc" e altre frasi chiave, ma non ho trovato nulla per quello che sento dovrebbe essere un problema abbastanza comune per trovare informazioni su.


2
Perché deve essere un alias? Spostalo in uno script di shell e completalo. La maggior parte dei sistemi di tipo * ix messo $HOME/binin PATHse si dispone di una tale directory in questi giorni.
Warren Young,

@WarrenYoung: hai ragione, questa particolare istanza potrebbe essere uno script. Tuttavia, vorrei comunque conoscere la risposta, poiché preferisco gli alias per altre cose e sicuramente mi imbatterò in questo. Potrei generalizzare la tua domanda in "perché Bash supporta gli alias quando qualcosa potrebbe essere uno script"?
dotancohen,

Perché il downvote? Come potrei migliorare la domanda? Ho fornito esempi, tentativi falliti e persino le frasi chiave su cui ho provato a cercare su Google.
dotancohen,

@dotancohen: penso che dovresti chiederlo separatamente. Ti darò una risposta parziale qui: alias cdp="cd ~/projects". Non posso farlo in uno script di shell.
Warren Young,

Risposte:


11

Utilizzare virgolette singole per sopprimere l'elaborazione di caratteri speciali. Potresti anche rovesciare la $ s.

Per un comando complesso probabilmente stai meglio usando una funzione in ogni caso, che non richiede alcuna fuga ed è più facile da leggere e modificare:

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

È possibile definire una funzione ovunque sia possibile definire un alias.


2
awkha anche uno spazio modello awk '/^Revision/{ print ...}' Quindi, in questo caso, non è necessario grep.
Valentin Bajrami,
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.