我可以创建一个改变任何命令的“通配符”bash别名吗?

时间:2014-12-15 21:10:15

标签: bash alias pipeline

这里的灵感是一个恶作剧的想法,所以试着去看看它不是真的有用的事实......

假设我想在bash中设置一个别名,它会巧妙地将在提示符处输入的任何命令更改为相同的命令,但最终通过tac传送以反转最终输出。我尝试做的几个例子:

ls  --->  ls | tac
ls -la  --->  ls -la | tac
tail ./foo | grep 'bar'  --->  tail ./foo | grep 'bar' | tac

有没有办法设置一个别名或其他方法,将| tac附加到每个/每个命令的末尾,而无需进一步干预?额外考虑容易隐藏在bashrc中的想法。 ;)

2 个答案:

答案 0 :(得分:4)

这并不保证是无副作用的,但它可能是第一次明智的削减:

reverse_command() {
  # C check the number of entries in the `BASH_SOURCE` array to ensure that it's empty
  # ...(meaning an interactive command).
  if (( ${#BASH_SOURCE[@]} <= 1 )); then
    # For an interactive command, take its text, tack on `| tac`, and evaluate
    eval "${BASH_COMMAND} | tac"
    # ...then return false to suppress the non-reversed version.
    false
  else
    # for a noninteractive command, return true to run the original unmodified
    true
  fi
}

# turn on extended DEBUG hook behavior (necessary to suppress original commands).
shopt -s extdebug

# install our trap
trap reverse_command DEBUG

答案 1 :(得分:1)

bash不支持以这种方式修改命令。但是,它允许您重定向shell本身的标准输出,然后每个命令将继承。将其添加到.bashrc

exec > >( tac )