在zsh或bash中打印执行的别名

前端之家收集整理的这篇文章主要介绍了在zsh或bash中打印执行的别名前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
目前的情况是,我在.zshrc中定义了一些别名
alias gco='git checkout'
alias cdp='cd ..'

还有那么多.
我的问题是每次输入别名时如何打印命令并按回车键?

例如:

$> gco master
> Command: git checkout master
> Git process ...

类似的东西,如果解决方案也适用于bash会更好!
谢谢!

解决方法

这是一个很好的问题.我们可以通过定义几个函数来扩展别名,然后在执行它们之前使用preexec钩子来运行它们.

我从here那里得到了答案.

1.评估所有别名

_aliases="$(alias -Lr 2>/dev/null || alias)"

alias_for() {
  [[ $1 =~ '[[:punct:]]' ]] && return
  local found="$( echo "$_aliases" | sed -nE "/^alias ${1}='?(.+)/s//\\1/p" )"
  [[ -n $found ]] && echo "${found%\'}"
}

首先,将所有别名存储在变量中.别名-r打印所有常规别名(不是全局或后缀),别名-L以“适合在启动脚本中使用的方式”打印它们.
alias_for()函数执行一些清理,删除引号并在行前放置别名.当我们回显${_ aliases}时,我们会得到这样的结果:

alias history='fc -l 1'
alias ls='ls -F -G'
alias lsdf='ls -1l ~/.*(@)'
alias mv='mv -v'

将此与别名的输出进行比较:

history='fc -l 1'
ls='ls -F -G'
lsdf='ls -1l ~/.*(@)'
mv='mv -v'

2.检查是否输入了别名的功能.

如果输入了别名,我们现在可以检测到它,然后将其打印出来:

expand_command_line() {
  [[ $# -eq 0 ]] && return         # If there's no input,return. Else... 
  local found_alias="$(alias_for $1)"    # Check if there's an alias for the comand.
  if [[ -n $found_alias ]]; then         # If there was
    echo ${found_alias}                  # Print it. 
  fi
}

3.每次输入命令时运行此命令

preexec功能非常适合这种情况.它的功能是:

Executed just after a command has been read and is about to be executed. If the history mechanism is active (and the line was not discarded from the history buffer),the string that the user typed is passed as the first argument,otherwise it is an empty string. The actual command that will be executed (including expanded aliases) is passed in two different forms: the second argument is a single-line,size-limited version of the command (with things like function bodies elided); the third argument contains the full text that is being executed.

from the zsh Manual,chapter 9.

注意,我们可能只是使用preeexec函数显示正在运行的内容.

要将我们的函数添加到preexec,我们使用钩子using this example

autoload -U add-zsh-hook        # Load the zsh hook module. 
add-zsh-hook preexec expand_command_line      # Adds the hook

要稍后删除钩子,我们可以使用:

# add-zsh-hook -d preexec expand_command_line # Remove it for this hook.

我的壳

这是我运行时shell的样子:

$1
cd -
$rake
bundle exec rake
^C
$chmod
usage:  chmod [-fhv] [-R [-H | -L | -P]] [-a | +a | =a  [i][# [ n]]] mode|entry file ...
    chmod [-fhv] [-R [-H | -L | -P]] [-E | -C | -N | -i | -I] file ...
$git lg1
fatal: Not a git repository (or any of the parent directories): .git

错误(或“功能”)

从我的shell示例中可以看出,当运行没有别名的命令(如chmod)时,不会显示完整命令.运行别名命令(如1或rake)时,将显示完整命令.

运行git别名(例如git lg1)时,不会展开git别名.如果你看一下我的first link,完整的例子确实使用了git别名扩展 – 你应该采用它并修改git别名对你来说至关重要.

猜你在找的Linux相关文章