使用tee >(bash)执行历史命令时预定义别名失效问题求助
解决历史命令选择工具无法识别别名的问题
问题重现
我用这条命令浏览并执行zsh历史记录里的命令:
cat $HOME/.zsh_history | sort | uniq | fzf | tr ";" "\n" | grep "^[^:]" | tee >(bash)
但选中像cls(我定义的alias cls=clear)这类别名执行时,会报错找不到命令。不管换成直接管道到bash,还是换成zsh,问题都一样。我的别名全存在$HOME/.bash_aliases里。
问题原因
你启动的bash或zsh是非交互式子shell,默认不会加载.bashrc、.zshrc这类交互式配置文件,自然也读不到你存在.bash_aliases里的别名。
解决方案
方案1:让子shell强制加载别名
直接在子shell启动时先加载你的别名文件,再执行选中的命令。
如果用bash,把最后一段改成:
tee >(bash -c 'source $HOME/.bash_aliases && eval "$(cat)"')
完整命令:
cat $HOME/.zsh_history | sort | uniq | fzf | tr ";" "\n" | grep "^[^:]" | tee >(bash -c 'source $HOME/.bash_aliases && eval "$(cat)"')
如果用zsh,同理改成:
tee >(zsh -c 'source $HOME/.bash_aliases && eval "$(cat)"')
原理:source加载别名文件后,eval读取管道传来的命令并执行,子shell就能识别别名了。
方案2:在当前shell执行(更简洁推荐)
如果不想启动子shell,直接在当前已加载别名的shell里执行,用变量保存选中命令再执行:
selected_cmd=$(cat $HOME/.zsh_history | sort | uniq | fzf | tr ";" "\n" | grep "^[^:]") echo "$selected_cmd" eval "$selected_cmd"
这样既满足先打印命令,又能直接用当前shell的环境,别名肯定生效。
额外提示
如果你的.zshrc里本来就有source ~/.bash_aliases,也可以用zsh -i启动交互式子shell(会自动加载.zshrc),但交互式shell可能会输出提示符,不如方案1干净:
tee >(zsh -i)
内容的提问来源于stack exchange,提问作者The Unconcerned Ape
相关产品推荐
相关产品推荐

