美文网首页
mac:终端==Alfred

mac:终端==Alfred

作者: hufang360 | 来源:发表于2020-11-22 04:22 被阅读0次

    最近发现可以在终端的配置文件里写代码,在终端输入配置文件里的方法名,就能执行指定代码了,能实现Alfred的部分功能。

    配置文件

    我所用的终端的是bash,配置文件是“.bash_profile”,mac上配置环境变量就是修改此文件,此文件位于用户目录下,新系统或者没有配置过环境变量的,没有这个文件,则需要用命令创建。

    以点号开头的文件默认是不可见的,在Finder(访达)中,按 “ ⌘ + ⇧ + . ” 开启/关闭 显示隐藏文件。

    例如我的用户名是“hf”,完整的路径就是 “/Users/hf/.bash_profile”,每次修改配置后 都要执行 source ~/.bash_profile 才会生效,下面是相关命令:

    # 创建配置文件,已存在时则会忽略
    touch ~/.bash_profile
    
    # 用 文本编辑 查看和编辑
    open -e ~/.bash_profile
    # 用 vim 查看和编辑
    # vim ~/.bash_profile
    
    # 更新配置,每次编辑过配置后,都要执行一次才能生效
    source ~/.bash_profile
    

    语法

    现在我有个想法,在终端中输入 bp 后按Enter键 打开配置文件输入 sp 后按Enter键 更新配置文件,配置文件是这样的:

    # 打开 配置文件
    bp() {
      open -e "$HOME/.bash_profile"
    }
    
    # 更新 配置文件
    sp() { source "$HOME/.bash_profile";}
    

    上面的 “$HOME” 和 “~” 是等价的。

    语句可以合并成单行,但需要特别注意格式:

    • 尖括号和方法名之间,需要至少有一个空格;
    • 代码起始位置 和尖括号之间,需要有一个空格;
    • 代码结尾位置 和尖括号之间,要有一个分号;
    • 多行代码之间用分号隔开;
    image

    我经常忘了写结尾的分号,更新配置时会报语法错误,错误提示中不会告诉你错在哪一行,下面的提示中的519实际是 .bash_profile 文件的总行数,而不是有语法错误的地方。有时写high了,报这个错误,就是一脸懵。所以适当的备份配置文件可以避免翻车。

    bash: /Users/hf/.bash_profile: line 519: syntax error: unexpected end of file;

    由于点号文件备份不方便,于是在配置中,加了这些。

    • 终端输入backbp(然后按Enter键)将配置备份成 backup.bash_profile

    • 终端输入 restorebp(然后按Enter键)将备份配置还原成 .bash_profile

    # 备份配置
    backbp() { cp -f "$HOME/.bash_profile" "$HOME/backup.bash_profile";}
    
    # 还原配置
    restorebp() { cp -f "$HOME/backup.bash_profile" "$HOME/.bash_profile"; source "$HOME/.bash_profile";}
    

    变量名 和 方法调用

    语法上,其实跟写shell脚本的是一样的,shell语法参考

    export iCloudDir="$HOME/Library/Mobile Documents/com~apple~CloudDocs"
    
    funcA() { echo "iCloud所在的路径是:$iCloudDir";}
    funcB() { echo "参数1是:$1"; echo "参数2是:$2"; echo "所有参数是:$@";}
    
    func1() { funcA;}
    func2() { funcB "arg1" "arg2";}
    

    终端执行情况:

    hf-home:~ hf$ func1
    iCloud所在的路径是:/Users/hf/Library/Mobile Documents/com~apple~CloudDocs
    
    hf-home:~ hf$ func2
    参数1是:arg1
    参数2是:arg2
    所有参数是:arg1 arg2
    

    个人习惯,变量名和配置内用到的方法名 采用驼峰命名法,终端上手敲的方法名都是 没有空格的小写内容

    案例1:终端流量走代理

    需要走代理时终端输入setproxy (然后按Enter键),取消代理则输入 unsetproxy(然后按Enter键)。

    1087是代理软件的端口号,根据实际情况填写,添加下面的内容到配置:

    # 设置代理
    setproxy() {
      export http_proxy=http://127.0.0.1:1087
      export https_proxy=http://127.0.0.1:1087
    }
    
    # 取消代理
    unsetproxy() {
      unset http_proxy
      unset https_proxy
    }
    
    # 简写
    # 设置代理
    # setproxy() { export http_proxy=http://127.0.0.1:1087 https_proxy=http://127.0.0.1:1087;}
    # 取消代理
    # unsetproxy() { unset http_proxy https_proxy;}
    

    案例2:剪贴板📋

    执行命令后,自动打开ssh连接,并将密码复制到剪贴板中,当ssh连接询问密码时,直接 ⌘+v 粘贴密码 (然后按Enter键)就可以连上服务器了。

    有时服务器的密码比较复杂,记不住,每次都要去笔记里拷贝过来。最近在玩树莓派,ssh连接命令是 ssh pi:raspberry@raspberrypi.local 重复内容比较多,老是输出错误

    # 设置剪贴板
    setClip() {
     osascript -e 'set the clipboard to "'"${*}"'" as text'
    }
    
    # 获取剪贴板
    getClip() {
     if [ "$(osascript -e 'clipboard info' | grep '«class utf8»')" != "" ];then
       echo $(osascript -e "get the clipboard as «class utf8»" | sed "s/utf8»//; s/»//")
     else
       echo ''
     fi
    }
    
    # 连接树莓派
    sshpi() {
      setClip "mypassowrd"
      ssh pi:raspberry@raspberrypi.local
    }
    

    如果服务器比较重要,可以对密码做一层处理,在终端运行下面一行命令,可以将密码转成base64文本:

    printf "mypassowrd" | base64
    # bXlwYXNzb3dyZA==
    

    配置中的方法改成这样:

    # 连接树莓派
    sshpi() {
      setClip "$(printf "bXlwYXNzb3dyZA==" | base64 -d)"
      ssh pi:raspberry@raspberrypi.local
    }
    

    案例3:open命令

    在mac上open命令可以做很多事情,打开网页打开文件夹选中一个文件 以及 启动软件

    打开网页

    添加下面的代码到配置中:

    bd()                { open "https://www.baidu.com";}
    bl()                { open "https://www.bilibili.com";}
    gg()                { open "https://www.google.com";}
    yq()                { open "https://www.yuque.com/hufang/pub/mac";}
    yuque()             { open "https://www.yuque.com/hufang/pub/mac";}
    

    当你输入 bd(然后按Enter键)后会自动启动默认浏览器访问百度,mac上默认浏览器是Safari,也可以将Chrome设置为默认浏览器。

    当你输入 gg 就会打开google

    ……

    类似的还可以添加很多,在配置两个字母的方法前一定要在终端里运行一下,看看这个命令有用了,输入命令后 提示如下提示说明命令是可以用的

    -bash: bd: command not found

    其实网址类的要尽量少添加,利用好浏览器的书签功能,也能很高效。
    命名尽量符合个人的自觉,比如 yqyuque 功能相同,但我每次是输 yuque,这就是直觉,有点本能反应的意味。

    打开文件夹

    我的配置中有这么一段:

    dl()                { open "$HOME/Downloads";}
    dirdown()           { open "$HOME/Downloads";}
    dirdl()             { open "$HOME/Downloads";}
    opendl()            { open "$HOME/Downloads";}
    opendown()          { open "$HOME/Downloads";}
    
    dirdoc()            { open "/Volumes/Extend/Documents";}
    dirvideo()          { open "/Volumes/Extend/Documents/Videos";}
    dirdmg()            { open "/Volumes/Extend/Soft/dmg";}
    dirsoft()           { open "/Volumes/Extend/Soft/dmg";}
    dirapk()            { open "/Volumes/Extend/Soft/APP_Apk";}
    
    dirapp()            { open -R "/System/Applications/Preview.app";}
    
    dirbrew()           { open "$HOME/Library/Caches/Homebrew/downloads";}
    dirworkflow()       { open "$HOME/Library/Services";}
    

    dldirdowndirdlopendlopendown

    都是 打开默认的下载目录,是曾经用过的命令,最后dirdown 用的比较多,这也用终端当启动器的弊端。它们的区别,大家可以体会一下。

    其实常用目录可以用快捷键切换,切到 下载目录,按快捷键 ⌥+⌘+ L就可以了,也是能不写到配置里就不写,只写最常用的。

    image-20201121191207767

    dirdocdirvideodirdmgdirsoftdirapk

    Extend 是我的一个硬盘分区,系统盘空间不够,大文件都会移动到这里。

    在mac上选中文件/文件夹后,按快捷键 ⌘+⌥+C 可以复制路径,粘贴出来就可以得到 /Volumes/Extend/Documents 这样的路径。

    dirapp

    在访达中打开应用程序目录,并选中 预览 这个app,打开应用目录还可以按 ⇧+⌘+A

    由于个人安装的软件比较多,就有点不好找,预览 会在目录的中间位置,而且这是系统应用,一定是存在的。

    open -R "/xx/xx.xx" 命令会打开访达,并选中一个文件。

    image-20201121193501495

    启动软件

    配置中有这么一段:

    typora()            { open "/Applications/Typora.app";}
    typora2()           { open -n "/Applications/Typora.app" --args "$HOME/Documents/markdown/default.md";}
    
    vinfo()             { open -n "/Applications/MediaInfo.app" --args "${*}";}
    vinfo2()            { open -n "/Applications/MediaInfo.app" --args "${getClip}";}
    
    runobs()            { open "$iCloudDir/mytool/mac-init/run_obs.sh";}
    
    runsome()           {
        open "/Applications/Bob.app"
        open "/Applications/Hidden Bar.app"
    }
    

    在终端里输出 typora 会启动Typora,如果已启用则会将其切换到前台;

    在终端里输出 typora2 会新开一个Typora,并打开对应文件;

    --args 参数只会在应用启动时传入,应用已经启动时,参数就接收不到了,而且也不是所有应用都会接收和处理这个参数。

    -n 参数表示新开一个应用

    vinfovinfo2

    安装Mediainfo后,在终端里输入 vinfo /xx/xx.mp4,就会调用Mediainfo查看mp4的属性,这种方式有点模拟终端敲命令的意味;

    执行 vinfo2 前,先复制一个视频文件的路径到剪贴板,比如,选中一个mp4后按快捷键 ⌘+⌥+c,然后在终端里输入 vinfo2 后直接敲Enter键,就会调用Mediainfo查看mp4的属性。

    在终端里执行过一个命令后,按 (方向键上键)会调出上次执行的命令,再一下 则会调出上上一次的命令。

    如果要查看多个mp4的属性,我们只要 选中文件⌘+⌥+c终端按↑敲Enter键,如此往复,就可以很快地查看多个了。

    runobs

    open 命令还可以执行一个shell脚本

    runsome

    可以把常用的应用都写进来,下次重启电脑后,输个命令就会批量启动了


    总结

    其实还能扩展出很多用法,这取决于的想法 以及对shell脚本的熟练程度。

    ~ 👻 Enjoy ~

    相关文章

      网友评论

          本文标题:mac:终端==Alfred

          本文链接:https://www.haomeiwen.com/subject/bqaeiktx.html