Получить расширение псевдонима (как в bash, так и в zsh)

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

Например, если у меня есть:

alias g=hub alias cdh='cd $HOME' 

Я хочу иметь:

expand_alias g == hub

expand_alias cdh == cd $HOME

Хитрость в том, что две оболочки имеют разный выход: bash:

 $ alias g cdh alias g='git' alias cdh='cd $HOME' 

ЗШ:

 % alias g cdh g=hub cdh='cd $HOME' 

Обратите внимание на отсутствие префикса alias и кавычек вокруг hub

В zsh вы можете просто использовать

 get_alias() { printf '%s\n' $aliases[$1] } 

С bash (при условии, что он не находится в режиме POSIX, в этом случае его alias выдаст вывод, аналогичный zsh ), вы можете сделать:

 get_alias() ( eval ' alias() { printf "%s\n" "${1#*=}"; }'" $(alias -- "$1")" ) 

По сути, мы оцениваем вывод alias после переопределения alias как функции, которая печатает то, что находится справа от first = в его первом аргументе.

Вы можете использовать аналогичный подход для чего-то совместимого с большинством оболочек POSIX, zsh и bash :

 get_alias() { eval "set -- $(alias -- "$1")" eval 'printf "%s\n" "${'"$#"'#*=}"' } 

Основываясь на ответе Стефана Шазеля , я придумал:

 # Expand an alias as text - https://unix.stackexchange.com/q/463327/143394 function expand_alias { if [[ -n $ZSH_VERSION ]]; then # shellcheck disable=2154 # aliases referenced but not assigned printf '%s\n' "${aliases[$1]}" else # bash printf '%s\n' "${BASH_ALIASES[$1]}" fi } 

(с bash 4.0 или новее).

Как насчет определения функции оболочки:

 EXA() { alias $@ | sed 's/^/expand_/; s/=/ == /; s/\o047//g; '; } 

В моей среде zsh, когда я набираю alias без команды, я получаю в stdout список всех псевдонимов. То же самое происходит в bash (на MacOS оба). Они в форме alias=expansion

Так что вы можете фильтровать с помощью sed: alias | sed -ne 's/cdh=\(.*\)$/\1/p' alias | sed -ne 's/cdh=\(.*\)$/\1/p' если “cdh” – это псевдоним, который вы хотите знать. Вы можете сделать для этого функцию оболочки в своем профиле, если это обычная задача для вас:

expand_alias() { alias $@ | sed -ne 's/.*=\(.*\)$/\1/p' }