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.