这里的灵感是一个恶作剧的想法,所以试着去看看它不是真的有用的事实......
假设我想在bash中设置一个别名,它会巧妙地将在提示符处输入的任何命令更改为相同的命令,但最终通过tac
传送以反转最终输出。我尝试做的几个例子:
ls ---> ls | tac
ls -la ---> ls -la | tac
tail ./foo | grep 'bar' ---> tail ./foo | grep 'bar' | tac
有没有办法设置一个别名或其他方法,将| tac
附加到每个/每个命令的末尾,而无需进一步干预?额外考虑容易隐藏在bashrc中的想法。 ;)
答案 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 )