смотреть псевдоним команды расширения

67

Если запустить watchкоманду, содержащую псевдоним, она не будет расширять псевдоним. Я пробовал как с одинарными, так и с двойными кавычками, на самом деле дали следующий псевдоним:

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

Следующая команда не удастся

# watch ll
sh: ll: command not found

Разве не должно работать расширение командной строки в этом случае?

ztank1013
источник

Ответы:

98

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

Из bashх help 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 не расширит псевдоним. Чтобы обойти это, вам нужен псевдоним, который включает в себя нужные параметры (например, `alias 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 для немедленного ответа, чтобы проверить это. Я был неправ выше.
Сачин Дивекарь
@ChrisDown, так что даже если часы используют " sh -c", ваше объяснение применимо и к sh. Я прав?
Сачин Дивекарь
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 и определяет псевдонимы. С помощью -xwatch выполняет команда с использованием exec.)

Ха, на самом деле, это не работает. После отображения выходных данных 'll' один раз, а затем сна в течение 2 секунд, задание становится фоновым, с немного загадочным:

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

Почему это остановилось? Куда делась открытая скобка [? Черт, я думал, что это будет отличный ответ, но я не могу заставить его работать.

Джонатан Хартли
источник