спостерігати за розширенням псевдоніма команд


67

Якщо запустити watchкоманду, що містить псевдонім, вона не розширить псевдонім. Я спробував як з однією, так і з подвійною цитатами, насправді з огляду на наступний псевдонім:

# alias ll
alias ll='ls -l --color=tty'

Наступна команда не вдасться

# watch ll
sh: ll: command not found

Чи в цьому випадку не повинно працювати розширення командного рядка?

Відповіді:


98

Псевдоніми розгортаються лише в якості першого аргументу або після іншого псевдоніму з пробілом на кінці команди.

З bashhelp alias:

Пробіл у значенні VALUE змушує перевірити наступне слово на заміну псевдоніму, коли псевдонім розгорнуто.

Для цього спробуйте наступне:

alias watch='watch '
alias ll='ls -l --color=tty'
watch ll

Майте на увазі, що деякі версії watchкольорів смужок за замовчуванням, у деяких версіях це можна зупинити за допомогою --colorабо -G.


1
Це абсолютно приголомшлива відповідь! Дякую та +1 звичайно.
ztank1013

1
Дякую ... За весь цей час я звик: 1. введіть ll, 2. натисніть ctrl + alt + e, 3. потім приставку watch. Це економія часу.
anishsane

10
На жаль, у цього методу є обмеження, що ви не можете надати варіанти, watchоскільки псевдонім повинен бути наступним словом, тоді як для watchйого запуску потрібні його аргументи. Якщо ви спробували watch -n 10 <alias>, bash не розширить псевдонім. Щоб обійти його, вам потрібен псевдонім, який включає потрібні параметри (наприклад, `псевдонім watch-10 = 'watch -n 10'), все ще з пробілом.
indiv

2

Може, ми могли б вручну розгорнути псевдонім, перш ніж годинник побачить це?

watch $(alias ll | cut -d\' -f2)

Пояснення

Вихід alias llвиглядає так:

$ alias ll
alias ll='ls -lAGh'

Тож ми встановимо деліметр вирізання як одну цитату, і вирізаємо 2-е поле, залишаючи:

ls -lAGh

тобто розширений псевдонім. Це потім формує арг дані watch.

Складіть функцію, щоб це зробити

function watcha {
    watch $(alias "$@" | cut -d\' -f2)
}

Тоді,

watcha ll

працює за бажанням. Це жахливо і вийде з ладу у всіляких ситуаціях. Вибачте.


0

Я подумав, що тут основна проблема полягає у виконанні watch, аргумент надається " sh -c", що означає, що якщо псевдонім llне визначений у sh(dash shell's)середовищі, він не розширить його. Але я помилявся, і це не так, відповідь Кріса вище правильна.


2
Не зовсім. Спробуйте watch 'alias ll="ls -l --color=tty"; type ll; ll'.
Кріс Даун

+1 для негайної відповіді на її підтвердження. Я помилявся вище.
Sachin Divekar

@ChrisDown, тому навіть якщо годинник використовує " sh -c", ваше пояснення також застосовно sh. Маю рацію?
Sachin Divekar

1
Це залежить від того, для чого використовується оболонка sh. Зверніть увагу на те, що це робить роботу:sh -c $'alias ll="ls -l --color=tty"\ntype ll\nll'
Кріс вниз

0

Запустили watchнову інтерактивну оболонку, яка розширить псевдонім:

watch -x bash -i -c ll

( -xПризначений для того, щоб зупинити watchвикористання власного, sh -cщоб обернути нашу задану команду. Ми цього не хочемо, тому що нам потрібно перейти -iдо shабо bashзробити її інтерактивною оболонкою, яка читає .bashrc і визначає псевдоніми. З -x, watch, виконує команда за допомогою exec.)

Гах, насправді це не працює. Після відображення результату 'll' один раз, а потім спання 2 секунди, робота отримує фонове зображення, злегка загадковим:

1]+  Stopped                 watch -x bash -i -c ll

Чому це зупинилося? Куди пішла відкрита дужка [? Дарн, я думав, що це буде чудовою відповіддю, але я не можу змусити його працювати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.