繁体   English   中英

bash中的后缀别名

[英]Suffix aliases in bash

后缀别名是我考虑切换到ZSH但我想坚持使用bash的唯一原因。 那么在bash中可能有类似后缀别名的东西吗?

对于那些不知道后缀别名是什么的人,在ZSH中有以下内容

$ alias -s cpp=vi
$ filename.cpp

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

请注意,像xdg-open或gnome-open这样的东西是不够的。 我希望bash在输入文件名时执行命令。

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

您可以使用新的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
}

根据需要扩展它 - 每个=~是一个正则表达式匹配 ,所以随意使用你想要的任何正则表达式。

请注意,这与command-not-found Debian和Ubuntu软件包冲突,因此您可能需要卸载或以其他方式取消限制此软件包以获得可靠的结果。 (只需确保包含系统范围的/etc/bash*文件之后 ,在您自己的~/.bashrc~/.bash_profile文件中定义此函数,它应该正常工作。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM