Создавайте псевдонимы динамически

1050
Andrea Bergonzo

Я хочу создать псевдонимы на основе команды, ее подкоманд и параметров. Я хотел бы, чтобы псевдоним был аббревиатурой этих компонентов.

Это проще объяснить на реальном примере:

alias mc="mvn compile" alias mt="mvn test" alias mp="mvn package" alias mi="mvn install"  alias mcc="mvn clean compile" alias mct="mvn clean test" alias mcp="mvn clean package" alias mci="mvn clean install"  alias mcco="mvn clean compile --offline" alias mcto="mvn clean test --offline" alias mcpo="mvn clean package --offline" alias mcio="mvn clean install --offline" 

Так что я пытаюсь создать функцию, чтобы создать псевдонимы без необходимости копировать вставить все эти команды, если я хочу, чтобы добавить новый субкоманду, как validateэто должно быть просто, чтобы создать относительные псевдонимы ( mv, mcv, mcvo) или то же самое с новой опцией, как --debug( mccd, mctd, mcpd, mcid).

Я попробовал что-то вроде:

m="mvn " c="clean " p="package " "`$m$c$p`" # doesn't work 
2

1 ответ на вопрос

0
8bittree

Будьте осторожны, делая это.

Добавление здесь validateкоманды создаст mvпсевдоним, скрывая mvкоманду, используемую для перемещения файлов. Вы можете столкнуться с другими конфликтами имен. Мое решение ниже обеспечивает некоторую защиту, но это не поможет, если вы определите псевдоним, а затем добавите исполняемый файл с тем же именем к своему $PATHпотом. Если вы указываете команду при ее запуске (например "mv"), это предотвратит расширение псевдонима и запустит фактическую команду, а не псевдоним.

На решение:

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

gen_aliases() { local cmd="$" local c=$ which -s m$ || alias m$="mvn $cmd" which -s mc$ || alias mc$="mvn clean $cmd" which -s mc$o || alias mc$o="mvn clean $cmd --offline" }  for cmd in compile test package install; do gen_aliases "$cmd" done 

$является расширением параметра, которое записывает wordв стандартную ошибку и выходит из функции или сценария, если parameterне установлено или равно нулю. Дает нам некоторую проверку работоспособности, чтобы убедиться, что мы не создаем псевдонимы, если нам не дали команду сделать это.

$это расширение параметра, которое расширяется до lengthсимволов, $parameterначинающихся с offset, поэтому $дает нам первый символ $cmd.

which wordпроверяет, wordсуществует ли где-нибудь в $PATH. В -sМолчание это, так что мы просто получить значение выхода ( 0если он найден, 1если не найден), который затем мы используем с ||для выполнения aliasкоманд, только если whichничего не найти wordв $PATH.

Проверка результатов:

$ type mc mc is aliased to `mvn compile' $ type mcpo mcpo is aliased to `mvn clean package --offline' 

И добавив еще один набор псевдонимов:

$ gen_aliases validate $ type mv mv is /bin/mv $ type mcv mcv is aliased to `mvn clean validate' 
Спасибо! Также спасибо за предупреждение о переименовании `mv`. Есть ли способ программно проверить, будет ли команда-псевдоним скрывать системную команду или другой псевдоним? Andrea Bergonzo 7 лет назад 0
@AndreaBergonzo Вы можете использовать `which foo`, чтобы проверить, существует ли` foo` в `$ PATH`. Я отредактировал свой ответ, чтобы продемонстрировать это, и переместил вещи в функцию для дополнительного удобства. 8bittree 7 лет назад 0
Удивительно! Большое спасибо за редактирование! Andrea Bergonzo 7 лет назад 0
Кстати, даже если -s заставляет его замолчать, я получаю сообщения обо всех псевдонимах, когда перезагружаю оболочку. Andrea Bergonzo 7 лет назад 0

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