在bash中后缀别名

后缀别名是我考虑切换到ZSH的唯一原因,但我想坚持bash。 那么是否有可能在bash中有后缀别名?

对于那些不知道后缀别名是什么的,下面在ZSH中

$ alias -s cpp=vi $ filename.cpp 

将以filename.cpp作为第一个参数运行vi

请注意,诸如xdg-open或gnome-open是不够的。 当input文件名时,我希望bash执行命令。

完成对我来说非常重要。 因此,如果文件名的开头是键入的,那么如果在按下TAB键时文件的其余部分将被完成,那将是很好的。

Solutions Collecting From Web of "在bash中后缀别名"

您可以使用新的command_not_found_handle()函数来构建一个。 获得zsh后缀别名的完整能力将比我这里的简单例子做更多的工作; 但我的简单例子可能足以满足您的需求:

 $ command_not_found_handle() { if [[ $1 =~ .*.cpp ]]; then vi $1 ; elif [[ $1 =~ .*.java ]]; then cat $1 ; fi ; } $ splice.cpp # started vi on splice.cpp $ Year.java import java.util.Scanner; class Year { public static void main(String[] args) { Scanner yearenter = new Scanner(System.in); System.out.println("Enter year "); int year = yearenter.nextInt(); System.out.print("Year " + year + " is .."); if (year % 400!=0 || year % 4 != 0 && year % 100==0) System.out.println(" not a leapyear"); else System.out.println(" a leapyear"); } } $ 

这个功能已经扩展到足够清晰了:

 command_not_found_handle() { if [[ $1 =~ .*.cpp ]] then vi "$1" elif [[ $1 =~ .*.java ]] then cat "$1" fi } 

按照你所看到的扩展它 – each =~是一个正则表达式匹配 ,所以随意使用任何你想要的正则表达式。

请注意,这与command-not-found Debian和Ubuntu软件包有冲突,因此您可能需要卸载或以其他方式取消限制此软件包的可靠结果。 (只要确保这个函数在你自己的~/.bashrc~/.bash_profile文件中被定义了那么系统范围的/etc/bash*文件就包含这个文件中了)。