与open命令较劲的一下午

前言

一开始在osX中,也是习惯直接在终端命令行操作,很常见的一个需求是打开当前路径的图形化文件管理器,或者打开一个url链接,这个时候使用open命令会自动选择一个合适的程序来执行,这样在命令行中的工作效率得到了极大的提高。

当然,osX中的open是直接封装好的,在终端可以直接使用,迁移到linux之后,我选择使用了zsh,发现zsh是无法直接使用open,这并不让我感到意外,但是,在偶尔尝试一次fish shell,让我意外的发现这个家伙居然能直接用open,果然是开箱即用的香,但是fish的语法不兼容bash,会导致很多原有的配置文件无法正常使用,所以不打算使用fish作为默认的shell,但是这个open的特性是真的香,没什么能难倒程序员的,开始盘他。

追查

进入程序员之家Github,搜索一下fish的仓库。

凭借撸码多年的经验,这个open的实现应该会放在类似share的文件夹中,并会以open命名文件,果然,我们很快就发现了在share/functions/open.fish文件中找到了实现,源代码复制了一份贴一下:

#
# This allows us to use 'open FILENAME' to open a given file in the default
# application for the file.
#
if not command -sq open
    function open --description "Open file in default application"
        set -l options h/help
        argparse -n open $options -- $argv
        or return

        if set -q _flag_help
            __fish_print_help open
            return 0
        end

        if not set -q argv[1]
            printf (_ "%ls: Expected at least %d args, got only %d\n") open 1 0
            return 1
        end

        if type -q -f cygstart
            for i in $argv
                cygstart $i
            end
        else if type -q -f xdg-open
            for i in $argv
                xdg-open $i
            end
        else
            echo (_ 'No open utility found. Try installing "xdg-open" or "xdg-utils".')
        end
    end
end

其实我对fish的语法没有什么研究,但是以shell半桶水的技术,我们还是很容易就能发现其核心所在,cygstartxdg-open 两个调用,xygstart 这里忽略,xdg-open 才是今天的主菜。

和我之前的猜想一样,open肯定不是linux/unix原生支持的命令,只是我一直不知道原生的指令叫啥名字,现在参考fish的实现我们大概能知道应该就是这个xdg-open了。

xdg-open

按照linux的命令设计原则,既然命令名字中有横杠连接,并有xdg前缀,我们大概能想到事情没那么简单,对,那就是这不仅仅是一个指令,应该是一组指令。一个快速验证的方法,终端输入xdg并按下tab键自动补全,你会发现有好几个以 xdg- 命名的命令,我将其命名为xdg命令组。

当然,这里我们只说一下xdg-open,剩下的命令自己玩就好了,毕竟剧透太多了不好......

用法

打开特定的文件

xdg-open xxx.doc 
xdg-open xxx.pdf
xdg-open xxx.png

如果传入路径的话,则是使用文件管理器打开

xdg-open  .
xdg-open  ~/Downloads

还可以传入网址

xdg-open  www.google.com

制作“open”

既然知道open的实现原理,我们在自己的系统中就不用做一些兼容处理了,fish那是兼容多系统,我们直接用xdg-open来实现就好了,但是这个输入还是比较麻烦的,为了简化一下输入,我们用alias在zsh配置文件中处理一下:

alias open='xdg-open'

结语

折腾了一下,在zsh制作了一个open指令,顺便脑补了一点新知识。嗯嗯~~ 感觉大姨夫都正常了~

你可能感兴趣的:(与open命令较劲的一下午)