Использование нескольких псевдонимов в одной команде

Изменить :Определил свою проблему благодаря комментарию steeldriver.

Запуск echo $pid | head -1в bashничего не дает. Выполняя ту же команду в оболочке zsh, я получаю именно то, что хочу.

вывод оболочки bash ->2590 18425 18449

вывод оболочки zsh ->2590

При этом моя проблема была решена путем изменения оболочки скрипта на #!/bin/zsh.

Редактировать :Другим и более подходящим решением является просто использование echo $pid | awk '{print $1}'вместо echo $pid | head -1. Он работает на обеих оболочках. Благодаря комментарию Кристофера.

0
14.12.2020, 20:29
1 ответ

Это возможно в bash :, если последним символом определения псевдонима является пробел (или табуляция ), тогда bash также отменяет псевдоним следующего слова :

$ alias foo="echo "
$ alias bar="hello "
$ alias baz=world
$ foo bar baz
hello world

Ref:6.6 Псевдонимы в руководстве.

Таким образом, вы можете объединять псевдонимы :, но первое слово должно быть псевдонимом.


Я бы не стал использовать псевдонимы, хотя :это довольно тонко и, вероятно, ненадежно. Я бы использовал функцию, что-то вроде

gc() {
    local -A translation=(
        [cmp]=compute
        [ins]=instances
        [pdev]="--project=devproj-12891"
    )
    local -a args
    for arg in "$@"; do
        if [[ -v "translation[$arg]" ]]; then
            args+=("${translation[$arg]}")
        else
            args+=("$arg")
        fi
    done
    echo gcloud "${args[@]}"
}

Тогда

$ gc cmp ins list pdev
gcloud compute instances list --project=devproj-12891

Удалите echo, если он выглядит хорошо.


Обновлен ярлык адреса "ci", добавлено 2 слова "compute" "instances":

Это особый случай, потому что мы хотим добавить к аргументам не один элемент в кавычках, а два. Позвольте мне переписать эту функцию для большей расширяемости:

gc() {
    local -a args
    for arg in "$@"; do
        case $arg in
            cmp)  args+=( compute ) ;;
            ins)  args+=( instances ) ;;
            ci)   args+=( compute instances ) ;;
            pdev) args+=( "--project=devproj-12891" );;
            *)    args+=( "$arg" ) ;;
        esac
    done
    echo gcloud "${args[@]}"
}
2
18.03.2021, 22:43

Теги

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