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? Я намагався гугл про "заміну bashrc", "заміну легені bashrc" та інші ключові фрази, але я не знайшов нічого, для чого я вважаю, що це досить поширена проблема, щоб знайти інформацію про.


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 ...}' в цьому випадку немає необхідності в грепі.
Валентин Байрамі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.