ленивая замена bashrc

10

Как получить ~/.bashrcпсевдонимы для оценки $()замен во время выполнения , а не во время выполнения ~ / .bashrc (при открытии терминала)?

Я запускаю эту команду достаточно часто, чтобы добавить для нее псевдоним:

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

Однако, когда я добавляю его ~/.bashrcв качестве псевдонима, я вижу, что оценки жестко закодированы со значениями, которые они имели во время открытия терминала:

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

Если я открываю терминал, ~я получаю ошибки:

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

Я пробовал эти два варианта псевдонима в ~/.bashrc, они оба имеют одинаковый эффект (как я и ожидал):

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"

Как получить ~/.bashrcпсевдонимы для оценки $()замен во время выполнения ?

Кроме того, как можно найти эту ситуацию в Google? Я пытался найти в Google слова "bashrc substitution", "bashrc lazy substitution" и другие ключевые фразы, но я не нашел ничего, что, по моему мнению, должно быть достаточно распространенной проблемой, чтобы найти информацию.

dotancohen
источник
2
Почему это должен быть псевдоним? Переместите его в сценарий оболочки и покончите с этим. В наши дни большинство систем типа * ix помещаются $HOME/binв PATHкаталог, если у вас есть такой каталог.
Уоррен Янг
@WarrenYoung: Вы правы, этот конкретный экземпляр может быть скриптом. Тем не менее, я все еще хотел бы знать ответ, так как я предпочитаю псевдонимы для других вещей, и я обязательно столкнусь с этим. Я мог бы обобщить ваш вопрос на «почему Bash поддерживает псевдонимы, когда что-либо может быть скриптом».
dotancohen
Почему отрицательный голос? Как я могу улучшить вопрос? Я привел примеры, неудачные попытки и даже ключевые фразы, на которых я пытался гуглить.
dotancohen
@ Dotancohen: Я думаю, вы должны спросить об этом отдельно. Я дам частичный ответ здесь alias cdp="cd ~/projects". Не могу сделать это в сценарии оболочки.
Уоррен Янг

Ответы:

11

Используйте одинарные кавычки для подавления обработки специальных символов. Вы можете также обратную косую черту в $ с.

Для сложной команды вам, вероятно, лучше использовать функцию в любом случае, которая не требует экранирования и ее легче читать и редактировать:

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

Вы можете определить функцию везде, где вы можете определить псевдоним.

Майкл Гомер
источник
2
awkтакже имеет шаблонное пространство, awk '/^Revision/{ print ...}' поэтому в этом случае нет необходимости в grep.
Валентин Байрами