3

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

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

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

1 ответ1

0

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

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

На решение:

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

gen_aliases() {
    local cmd="${1:?No command to create aliases for.}"
    local c=${cmd:0:1}
    which -s m${c} || alias m${c}="mvn $cmd"
    which -s mc${c} || alias mc${c}="mvn clean $cmd"
    which -s mc${c}o || alias mc${c}o="mvn clean $cmd --offline"
}

for cmd in compile test package install; do
    gen_aliases "$cmd"
done

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

${parameter:offset:length} - это расширение параметра, которое расширяется до символов length $parameter начиная со offset , поэтому ${cmd:0:1} дает нам первый символ $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'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .