Определите псевдоним для введенной команды

Ваше обвинение в отсутствии документации для RHEL чрезвычайно плохо основано; RHEL является одним из лучших и наиболее всесторонне зарегистрированных дистрибутивов Linux там.

Информация о chkconfig, например, находится в главе 18 Руководства по развертыванию.

Если Вы находите, что Ваша установленная система, кажется, не имеет утилиты или страницы справочника, что Вы ожидаете быть там, связываться с Вашим системным администратором.

6
29.04.2015, 21:17
3 ответа

Вот концептуальный подход, который может работать.

Команда alias генерирует список всех псевдонимов, за каждым из которых следует = и его определение. Этот вывод может быть проанализирован путем извлечения псевдонима между первым пробелом и первым = . Все, что находится после первого = , будет определением, с которым будет сравниваться. Похоже, что с этим легко справиться с использованием ассоциативных массивов в awk.

Два осложнения (которые я вижу):

1) Поскольку определение может состоять из нескольких слов, вам нужно будет сделать что-то вроде измерения длины определения за вычетом любых заключительных кавычек и ограничить сравнение с введенная команда до этой длины.

2) Псевдонимы могут содержать странные вещи. Вот мой самый странный (и я уверен, что они могут быть намного более странными):

alias pqp='cd ~/pq;[ -n "$(ls)" ] && mprb * || echo "Print Queue Empty"'

Дело в том, что псевдонимы могут содержать (почти?) Все специальные символы, которые оболочка хочет интерпретировать и расширять, поэтому было бы лучше чтобы закодировать это в чем-то другом, например в awk или Python, где две строки, которые вам нужно сравнить, будут обрабатываться как простые символьные строки.

Следующая проблема заключается в том, что вы действительно хотите запустить команду после того, как вы закончите сопоставление и выдачу любых сообщений.

Здесь есть опасение, что все, что вы запускаете из своей программы, даже если это просто другой скрипт, будет (обычно) выполняться в дочернем процессе. Это означает, что любые (на уровне оболочки) побочные эффекты команды будут потеряны, когда команда завершится и подоболочка закрывается.Самая очевидная вещь - это код возврата $? , который вам нужно будет захватить и перевыпустить в качестве кода возврата вашей утилиты.

Если псевдоним включал вызов с использованием источника , . , тогда вам не повезет, потому что запуск ее в подоболочке полностью отменит предполагаемые побочные эффекты.

Оболочки содержат ряд встроенных команд, например cd . Некоторые из них имеют эквивалентные программы, как [ и / usr / bin / test , но некоторые, например cd , не имеют и даже для тех, которые поддерживают , встроенные версии не всегда имеют такое же поведение и параметры, как внешние.

Вышеупомянутые проблемы возникают из-за того, что последняя команда исходит не из стандартного ввода текущего уровня оболочки и из-за этого обрабатывается по-другому. Здесь может помочь что-то вроде AutoKey .

AutoKey - это макропроцессор, который можно использовать для автоматизации различных действий в среде X (gui). В этом контексте его можно использовать для вызова макроса при нажатии определенной пользователем горячей клавиши. Макрос может читать и анализировать командную строку, которую вы вводите в нее, выдавать любые сообщения (о псевдонимах и т. Д.), А затем повторно вводить команду, как если бы вы вводили ее на клавиатуре.

Преимущество здесь в том, что Linux (на самом деле ваша среда рабочего стола / эмулятор терминала) не может сказать, что это не вы вводите команду, и все происходит в исходной, родной среде, как если бы AutoKey вообще не было.

Вторым преимуществом этого подхода является то, что если вы просто вводите команду, не нажимая сначала горячую клавишу, это работает как обычно, без накладных расходов и т. Д.

Это подводит меня к заключительному пункту, который подробно обсуждался в различные места на stackexchange и в других местах.

Почти всегда плохая идея - брать обычную часть любой системы и изменять ее работу по умолчанию под капотом, не будучи полностью видимой пользователю (в данном случае вам).

Короче говоря, если вы настраиваете систему для нестандартного поведения, есть два основных последствия.

1) Если кто-то другой использует систему (например, чтобы помочь вам отладить проблему), он столкнется с неожиданными результатами, которые могут иметь множество неприятных последствий.

2) Вы привыкаете к измененному поведению, а затем (подсознательно) ожидаете, что оно сработает, когда вы используете другую систему, которая не была настроена таким же образом.

Классическим примером этого является определение псевдонима, такого как

alias rm='rm -i'

. Это звучит как отличная идея, пока вы не наберете rm в другой системе, и файлы будут немедленно удалены, когда вы ожидали, что сначала появится запрос. .

Можно обойти это примерно так:

alias rmi='rm -i'

Если вы введете его, он работает, но если вы введете его в другой системе, он, вероятно, не сделает ничего, кроме выдачи ошибки «команда не найдена».

Это особенно важно посреди ночи, когда что-то важное сломано, вы не так бдительны, как хотелось бы, и вам нужно исправить это сейчас .Вот когда вы действительно не хотите неожиданного поведения или вещей, на которые приходится тратить время на объяснения людям.

Он работает так же, как и проверка псевдонима с помощью макроса AutoKey, активируемого горячей клавишей.Если вы не изо всех сил активируете макрос, нажав горячую клавишу, тогда все будет работать так, как и ожидалось. Правильно выбранная горячая клавиша, вероятно, не будет нажата случайно и, если нажать на другую систему по привычке, вероятно, не принесет ничего вредного.

6
27.01.2020, 20:27

У меня есть решение в bash . Вам нужна функция, которая выполняется перед каждой командой. Так как bash не поддерживает это врождённо, вам придётся работать с этим, используя ловушку DEBUG.

См. часть бэш-страницы руководства в ловушке DEBUG:

Если sigspec - DEBUG, то команда arg выполняется перед каждой простая команда, для команды, случайная команда, команда выбора, каждый арифметика для команды, и до того, как первая команда выполнит в shell function

Так что функция может выглядеть следующим образом (первая часть скопирована из ответа суперпользователя ):

preexec () {
  [ -n "$COMP_LINE" ] && return  # do nothing if completing
  [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return # don't cause a preexec for $PROMPT_COMMAND
  local this_command=$(HISTTIMEFORMAT= history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//")
  # check if the command occures as an alias
  a=$(alias | grep -F "='""$this_command""'" | grep -oP '(?<=alias\ )[^=]+')
  # if yes, print a notice
  [ -n "$a" ] && echo -e "You can use an alias you have for that: \033[01;32m$a\033[00m"
}
trap 'preexec' DEBUG

При наборе:

$ git checkout master

Она печатает:

You can use an alias you have for that: gcm

и затем возвращается с командой.

1
27.01.2020, 20:27

Нашел это, когда исследовал то, что хотел.

Для zsh есть плагин alias-tips , который уже делает это.

0
27.01.2020, 20:27

Теги

Похожие вопросы