Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Linux 命令行终端操作积累 #27

Open
7 of 11 tasks
solomonxie opened this issue Jan 23, 2018 · 105 comments
Open
7 of 11 tasks

Linux 命令行终端操作积累 #27

solomonxie opened this issue Jan 23, 2018 · 105 comments
Labels
HF High frequency notes Linux
Milestone

Comments

@solomonxie
Copy link
Owner

solomonxie commented Jan 23, 2018

积累终端命令行相关经验,包括Shell中的bash,zsh,终端中的Terminal, Mac Terminal.app,iTerm等

注意:这里说linux,linux之类的,其实在mac中也ok。只不过说起来和搜索起来方便而已。

涉及领域

  • Shell
    • Bash
    • Zsh
    • Fish
  • Linux CLI工具
  • Linux Package Manager 包管理器
    • Apt
    • Homebrew
    • Apk
    • Pacman
    • rpm
@solomonxie
Copy link
Owner Author

命令行添加文字颜色

不是终端的颜色主题,只加了颜色主题但是文字还是同样颜色,其实没什么用。主要就是要类似于语法高亮的功能,要不然命令行里源源不断的一页一页的字冒出来实在不好读。

方案一:直接添加Terminal的配置文件

Mac中和Linux是一样的,直接在本用户的根目录添加一个.bash_profile文件写入配置,打开颜色开关即可。

$ vi ~/.bash_profile
export CLICOLOR=1

但是效果不佳,开关顶多加上了ls文件夹的颜色,没什么大用。如图:
image
所以就需要再进一步找一个靠谱的解决方案。

@solomonxie
Copy link
Owner Author

solomonxie commented Jan 23, 2018

❖ Bash/ZSH 命令后里修改前缀 (隐藏用户@主机,添加Git分支名称)

每次在命令行里进入有git的文件夹,都没什么显示,不像网上其他人截屏出来的样子,就好奇怎么弄的。下面分bash和zsh两种方式分别来说。
注:这里都是使用的Mac Terminal.app做实验,Mac的iTerm或Linux上的终端没有做实验,但是操作不会有太大差异。

1. Bash的修改方法

其实特简单,还是在~/.bash_profile文件中添加:

$ vim ~/.bash_profile

# Shows Git branch name in prompt.
parse_git_branch() {
  git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
export PS1="\u@\h \W\[\033[32m\]\$(parse_git_branch)\[\033[00m\] $ "
# Or hide User @ Name (still with git branch name)
# export PS1="\W\[\033[32m\]\$(parse_git_branch)\[\033[00m\] $ "

效果如下:

image

2. Zsh的修改方法

类似于Bash,在~/.zshrc这个文件中修改,打开后,随便找个位置(最好靠上面一点方便查看)加上一行DEFAULT_USER=$USER 即可。如果为zsh安装了Oh my zsh这个工具(一般玩zsh第一步就是安装它),这里就不需要单独处理像Bash一样手动编程添加Git名称了,因为会自动出现。进入zsh后,可以看到效果如下:

image

当然,我这里的Git分支还配上了图标和颜色等,这都需要给终端(这里是Mac Terminal.app)安装相应配色方案,我用的是著名的Solarized Dark配色方案。具体配色和字体问题(字体用来支持图标,因为那些图标的本质是文字),需要专开一篇来说。

Zsh中将全路径缩短为当前文件夹名

有时候经常嫌一层一层目录实在太长太占地方,而且截屏时也不方便把全路径显示出来。所以需要隐藏起来会比较方便,需要看全路径的话一句pwd就显示了。
默认全路径显示:

image

修改后效果:

snip20180217_106

Zsh中,配置文件~/.zshrc里面可以配置DEFAULT_USER=$USER来隐藏用户名和主机名,下面还有一句prompt_context() {}设定一般来说是可以写入函数来隐藏全路径并只显示当前文件夹的。
但是配置了agnoster配色主题后,怎么修改好像都没用,参考这篇文章,得知,只要到agnoster配色主题的配置文件中改一个字即可:
找到文件:一般是在这个位置~/.oh-my-zsh/themes/agnoster.zsh-theme,打开后找到prompt_dir() {}这个函数,然后将prompt_segment blue black '%~'最后面的~改为c即可:prompt_segment blue black '%c'

image

@solomonxie
Copy link
Owner Author

solomonxie commented Jan 23, 2018

❖ Mac安装并配置zsh

zsh原称为Z Shell。也是一种shell,兼容最常用的bash这种shell的命令和操作,并且有很多增强,超强的订制性。查来查去,bash虽然很标准,但是自己日常的话还是不要太偏执,力求简单方便的工具更好,所以就玩弄起了zsh。超漂亮又简单,也很好上手。

Mac原生就安装了zsh,linux的话需要安装一下,简单如sudo apt-get install zsh这样就安装好了。
可以先通过cat /etc/shells查看自己有哪些shell,一般都会有很多种。
使用方法很简单,直接在命令行里输入zsh就开始使用了。不过要变成每次打开终端默认使用zsh,则需要改配置。

安装Oh My Zsh

原本zsh就是很强大,但是配置超难,直到Oh my zsh工具出现,一切zsh的配置都变简单了。所以这是用zsh的必备工具,安装只需一句话:

sudo  curl -L https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh | sh 

屏幕显示这个图,就算安装好了:

image

然后再打开终端,感觉一切都变了:直接进入zsh,命令行前一大串的用户名主机等都被隐藏了,进入git文件夹时前面也都加上了git (master)这样的带颜色分支字样,按Tab自动补全时也不用区分大小写了(太棒了)。。。如下图
image

有一点需要注意,安装完oh my zsh后,机子(Mac)上的Terminal会变成默认打开就进入zsh。如果不习惯的话,可以改回默认先。Mac的Terminal在设置里将shell open with改成/bin/bash就好了:
image

@solomonxie solomonxie changed the title Bash shell | Terminal 操作积累 Shells | Terminal 操作积累 Jan 23, 2018
@solomonxie solomonxie changed the title Shells | Terminal 操作积累 Terminal操作积累 Jan 23, 2018
@solomonxie
Copy link
Owner Author

solomonxie commented Jan 24, 2018

❖ Mac 终端配色方案 Color schemes

要想配置出这种好看的方案,标配就是:zsh + Meslo字体 + Soloarized Dark显示方案 + Agnoster配色方案。网上有很多文章介绍,不过这里也简单总结个cheatsheet方便以后用。
注:之前已经写了zsh和基本工具oh my zsh的安装方法了。后面都是在此基础上。

image

1. 安装Solarized显示方案 (仅用于本地客户端应用)

显示方案主要负责修饰命令行前缀,隐藏user@host,识别git文件夹,添加图标,命令高亮等。
Solarized官网下载一个zip压缩包。压缩包中包含了这种颜色方案应用在各种各样平台、终端、软件的配置文件。找到自己用的终端文件夹。如我用的是Mac Terminal,那么就在osx-terminal.app-colors-solarized这个文件夹,将里面的Solarized Dark ansi.terminal文件导入到终端。如下图:

image

image
在终端的配置里导入配色方案后,就出现了Solarized Dark选项,将其设为默认,重新打开终端,就出现基本的配色方案了。

2. 安装字体 (仅用于本地客户端应用)

Solarized配色包需要Meslo LG M Regular for Powerline这种字体才能显示各种特殊字符(图标),下载好ttf字体文件并安装。下载链接在这里https://github.com/powerline/fonts/raw/master/Meslo%20Slashed/Meslo%20LG%20M%20Regular%20for%20Powerline.ttf
装好以后,可以在终端中输入这个来测试是否成功:
echo "\ue0b0 \u00b1 \ue0a0 \u27a6 \u2718 \u26a1 \u2699"
如果能正常显示所有图标,则安装成功。
然后打开终端的偏好设置,在当前Solarized的配色方案下,找到字体选项,选择Meslo LG M Regular for Powerline字体,成功。

image

3. 设定Agnoster配色主题

不同于如Solarized显示方案,配色主题单纯负责颜色问题。
这个需要在Zsh配置文件~/.zshrc中配置,由于agnoster是Oh My Zsh工具自带,所以无需安装额外文件直接修改选项。
找到~/.zshrc文件,将ZSH_THEME变量改成agnoster,保存并重新打开终端即可。如下图:

image

最后,我在Mac终端上显示效果如下:

image

好像颜色哪里差了点,是因为它原生在iTerm终端才能发挥完全效果。效果如下:

image

iTerm的配置方法和Terminal.app非常相似,自己在偏好设置中采用类似的操作即可。
关于其它Oh My Zsh自带的色彩主题,可以到这里看效果:
https://github.com/robbyrussell/oh-my-zsh/wiki/Themes

@solomonxie
Copy link
Owner Author

solomonxie commented Jan 24, 2018

终端里添加快捷路径

一般要一路cd进入五层以上的目录,是真的有点头疼。所以研究了下有没有设置快捷路径的方法

  1. 方法一:设置系统变量
    通过在~/.bash_profile~/.zshrc里面设置export DIR="/path/path/path"'这种来设置变量,然后引用是通过$var来引用。 但是每次都加$`确实有点不爽,好像也没达到什么特别快捷的方法。
  2. 方法二:alias
    直接设置alias topath="cd /path/path/path"这种来设置别名,每次在终端直接输入类似topath,回车即可。这种方式是可取的。
    为了保证可管理性,建议所有的alias别名都放到~/.bash_profile这种用户自定义的终端配置文件里,方便以后备份移植。

@solomonxie
Copy link
Owner Author

solomonxie commented Jan 24, 2018

Zsh 常用插件

zsh有了各种插件后才真是如虎添翼,各种命令高亮,自动补全,命令参数辅助等。

zsh插件安装方法

各种插件的安装方法各异,有的直接将插件文件夹拷贝到~/.oh-my-zsh/custom/plugins目录中,然后在~/.zshrc中的plugins数组中加入插件名即可;有的则需要配合别的工具并在~/.zshrc中加入别的命令。以下是几个常用的。
安装时经常会看到一些$ZSH_xx变量,这些都是zsh或oh my zsh设置的各种变量,便于插件运用。我们安装插件时也可以用这些变量安装,如插件保存的位置一般为$ZSH_CUSTOM/plugins/插件文件夹名/

Oh my zsh自带插件

自带插件在安装时就已经存在了,默认是只开启了git一个插件。其它的话也很简单,只需要在~/.zshrc文件中添加引用即可。打开文件找到plugins数组,然后把插件名加入数组即算开启。
如下图:

image

目前已经有的自带插件在官网Github中可以看到,https://github.com/robbyrussell/oh-my-zsh/tree/master/plugins
凡是这里有的,都可以立刻生效。

Zsh命令自动补全插件 zsh-autosuggestions

这里利用Oh my zsh的方法安装。直接一句话命令行里下载并移动到oh my zsh目录中:

git clone https://github.com/zsh-users/zsh-autosuggestions $ZSH_CUSTOM/plugins/zsh-autosuggestions

然后在~/.zshrc文件中找到plugins数组,加入zsh-autosuggestions名字,重新打开终端即可。

Zsh命令语法高亮插件 zsh-syntax-highlighting

将插件下载到oh my zsh的插件目录下的该新建插件同名文件夹中

git clone https://github.com/zsh-users/zsh-syntax-highlighting.git $ZSH_CUSTOM/plugins/zsh-syntax-highlighting

编辑~/.zshrc文件将然后将插件引用命令写入该文件最后一行(必须)

# Note the source command must be at the end of .zshrc
source "$ZSH_CUSTOM/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh"

保存重新打开即可看到高亮的命令行了。

Zsh自动跳转目录插件 autojump

安装方法:

brew install autojump

# 未完待续...

@solomonxie
Copy link
Owner Author

solomonxie commented Jan 25, 2018

Mac终端里用Sublime Text或其他应用程序打开文件

Mac下的Sublime Text的位置是/Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl
所以我们直接用alias别名引用它就好了。
Bash的话在~/.bash_profile里,zsh的话在~/.zshrc里,直接加入这句话:

alias subl="/Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl"

然后就可以直接命令行里打开编辑器了:

subl ~/readme.txt

执行后会弹出Sublime Text编辑器,并打开readme.txt文件。

同理,换成其它编辑器,或在其它系统里,也是这样修改流程

@solomonxie
Copy link
Owner Author

solomonxie commented Jan 25, 2018

❖ ffmpeg 超强视频处理程序 [DRAFT]

开源视频处理几乎必用的一个程序,功能强大。

Installation

# for Ubuntu 14.04 (no need to install on 15.04)
sudo add-apt-repository ppa:mc3man/trusty-media
sudo apt-get update
sudo apt-get dist-upgrade
sudo apt-get install ffmpeg -y

以最低CPU优先率执行命令

nice -19 ffmpeg 各种参数

mp4 to mp3

# 
$ ffmpeg -i <FILE> -vn <OUT>

.webm to .mp4

nice -19 ffmpeg -i input.webm -c:v libx264 -crf 20 -c:a aac -strict experimental out.mp4

Split Video

# 不转码截取片段()
nice -19 ffmpeg -i "input.mp4" -ss 00:03:25 -to 00:05:42 -c copy "output.mp4"

调整音频与视频匹配不上的问题

方法1

nice -19 ffmpeg -i "input.mp4" -itsoffset 2.0 -i "input.mp4" -vcodec copy -acodec copy -map 0:0 -map 1:1 "output.mp4"

方法2: 一开始就分开截取音频视频 然后再合并

# ...

ffmpeg的参数顺序很重要, 不同的顺序造成截然不同的结果

切割视频

# 从指定开始点到指定结束点
ffmpeg -i 文件名 -ss 01:00:00 -t 00:06:00  -vcodec copy -acodec copy 输出文件名
ffmpeg -i 文件名 -ss 00:01:00 -to 00:02:00 -c copy 输出文件名
# 从指定开始点到指定时长
ffmpeg -ss 00:01:00 -i 文件名 -to 00:02:00 -c copy 输出文件名
# 调整音频匹配不上的问题 #方法1
ffmpeg -i "test.mp4" -itsoffset 2.0 -i "test.mp4" -vcodec copy -acodec copy -map 0:0 -map 1:1 "new.mp4"

# 调整音频匹配不上的问题 #方法2: 一开始就分开截取音频视频 然后再合并
# 

@solomonxie solomonxie changed the title Terminal操作积累 Terminal Shell Operations 命令行终端操作积累 Jan 26, 2018
@solomonxie solomonxie changed the title Terminal Shell Operations 命令行终端操作积累 Terminal 命令行终端操作积累 Jan 26, 2018
@solomonxie
Copy link
Owner Author

cd命令常用技巧

  • cd ~ 进入用户主目录,cd 空格也行;
  • cd - 返回进前一个所在目录;
  • cd .. 返回上级目录;
  • cd ../.. 返回上两级目录;
  • cd !$ 把上个命令的参数作为cd参数使用

@solomonxie
Copy link
Owner Author

rm 删除文件和文件夹

  • rm 文件名删除文件
  • rm -rf 文件夹 删除文件夹及其内所有文件

@solomonxie
Copy link
Owner Author

solomonxie commented Jan 30, 2018

修改终端默认的shell

之前说过了,一般终端的默认Shell只要在终端应用如Terminal.app,iTerm2等的系统设置里直接改就好了。
但是如果我们要用ssh登录服务器就不能这么设置了,需要用到chsh这个命令。很简单
如果不懂的话,直接 man chsh就可以看到很简单的描述--改变登录shell。
首先要查到当前机器有哪些以安装的shell,cat /etc/shells

image

我的默认有这些,可以看到zsh位于/bin/zsh,那么如果想要将zsh改为默认,就直接在终端里输入:

chsh -s /bin/zsh

即可达到修改默认终端的效果。如果是ssh连接服务器的话,需要重连才能看到效果。

@solomonxie
Copy link
Owner Author

Mac在终端上的快捷键

一开始是为了找翻屏(上下滚动)的快捷键,Windows和Linux上一般PageUp, PageDown即可,Macbook上没有这两个键,所以还挺难找的。后来查了一系列其它的终端快捷键,如下:

  • Cmd+Up 向上滚动
  • Cmd+Dn 向下滚动
  • Fn+LeftCtrl+A一样,移到命令行最左端
  • Fn+RightCtrl+E一样,移动的命令行最右端
  • Ctrl+U 删除当前命令行
  • Ctrl+K 删除当前光标后的所有内容

@solomonxie solomonxie changed the title Terminal 命令行终端操作积累 Shells 命令行终端操作积累 Feb 3, 2018
@solomonxie
Copy link
Owner Author

Bash里读取Json数据

查看Stackovervlow, 发现答案,既可以使用sed+awk来自己写解析读取json,也可以通过引用python方法来更方便的解析。推荐python方法,如下:

echo '{"hostname":"test","domainname":"example.com"}' | python -c 'import json,sys;obj=json.load(sys.stdin);print obj[0]["hostname"]'

由于*nix都原生带有python,所以这么执行是没问题的。而且一般也不用考虑到执行速度问题。

@solomonxie
Copy link
Owner Author

solomonxie commented Feb 3, 2018

Bash键盘快捷键

参考菜鸟教程

快捷键 快捷键说明
OOOOO OOOOO
CTRL-A 将光标移到行首(在命令行下)
CTRL-B 退格 (非破坏性的),这个只是将光标位置往回移动一个位置。
CTRL-C 中断,终结一个前台作业。
CTRL-D “EOF” (文件结尾:end of file)。它用于表示标准输入(stdin)的结束。在控制台或xterm 窗口输入文本时,CTRL-D 删除在光标下的字符。从一个shell中退出 (类似于exit)。如果没有字符存在,CTRL-D 则会登出该会话。在一个xterm窗口中,则会产生关闭此窗口的效果。
CTRL-E 将光标移动到行尾(在命令行下)
CTRL-F 将光标向前移动一个字符(在命令行下)
CTRL-G BEL。在一些老式打印机终端上,这会引发一个响铃。在xterm终端上可能是哔的一声。
CTRL-H 擦除(Rubout)(破坏性的退格)。在光标往回移动的时候,同时擦除光标前的一个字符。
CTRL-I 水平制表符。
CTRL-J 新行(换行[line feed]并到行首)。在脚本中,也可能表示为八进制形式(‘/012′)或十六进制形式(‘/x0a’)。
CTRL-K 垂直制表符(Vertical tab)。在控制台或 xterm 窗口输入文本时,CTRL-K会删除从光标所在处到行尾的所有字符。在脚本中,也可能表示为八进制形式(‘/013′)或十六进制形式(‘/x0b’)。
CTRL-L 跳纸,换页(Formfeed),清屏。清空终端屏幕。在终端上,这个命令的作用和clear命令一样。但当这个命令发送到打印机时,Ctrl-L会直接跳到纸张(Paper sheet)的末尾。
CTRL-M 回车(Carriage return)。
CTRL-N 擦除从history缓冲区召回的一行文本(在命令行下)。如果当前输入是历史记录中选择的时候,这个是从这个历史记录开始,每按一次,是更接近的一条命令。
CTRL-O 产生一个新行(在命令行下)。
CTRL-P 从history缓冲区召回上一次的命令(在命令行下)。此快捷键召回的顺序是由近及远的召回,即按一次,召回的是前一次的命令,再按一次,是召回上一次之前的命令,这和CTRL-N都是以当前的输入为起点,但是两个命令操作刚好相反,CTRL-N是从起点开始由远及近(如果起点是历史命令的话)。
CTRL-Q Resume (XON)。恢复/解冻,这个命令是恢复终端的stdin用的,可参见CTRL-S。
CTRL-R 回溯搜索(Backwards search)history缓冲区内的文本(在命令行下)。注意:按下之后,提示符会变成(reverse-i-search)”:输入的搜索内容出现在单引号内,同时冒号后面出现最近最匹配的历史命令。
CTRL-S Suspend(XOFF),挂起。这个是冻结终端的stdin。要恢复可以按CTRL-Q。
CTRL-T 交换光标位置与光标的前一个位置的字符内容(在命令行下)。比如:echo $var;,假设光标在a上,那么,按下C-T之后,v和a将会交换位置:echo $avr;。
CTRL-U 擦除从光标位置开始到行首的所有字符内容。在某些设置下,CTRL-U会不以光标位置为参考而删除整行的输入。
CTRL-V 在输入文本的时候,按下C-V之后,可以插入控制字符。比如:echo -e '/x0a’;和echo ;这两种效果一样。这点功能在文本编辑器内非常有效。
CTRL-W 当在控制台或一个xterm窗口敲入文本时, CTRL-W 会删除从在光标处往后(回)的第一个空白符之间的内容。在某些设置里, CTRL-W 删除光标往后(回)到第一个非文字和数字之间的字符。
CTRL-X 在某些文字处理程序中,这个控制字符将会剪切高亮的文本并且将它复制到剪贴板中。
CTRL-Y 将之前已经清除的文本粘贴回来(主要针对CTRL-U或CTRL-W)。
CTRL-Z 暂停一个前台的作业;在某些文本处理程序中也作为替换操作;在MSDOS文件系统中作为EOF(End-of-file)字符。
CTRL-/ 退出。和CTRL-C差不多,也可能dump一个”core”文件到你的工作目录下(这个文件可能对你没用)。
CTRL-/ 撤消操作,Undo。
CTRL-_ 撤消操作。
CTRL-xx 在行首和光标两个位置间进行切换,此处是两个”x”字符。
ALT-B 光标往回跳一个词,词以非字母为界(跳动到当前光标所在词的开头)。
ALT-F 光标往前跳一个词(移动到光标所在词的末尾)。
ALT-D 删除光标所在位置到光标所在词的结尾位置的所有内容(如果光标是在词开头,则删除整个词)。
ALT-BASKSPACE 删除光标所在位置到词开头的所有内容。
ALT-C 将光标所在位置的字母转为大写(如果光标在一个词的起始位置或之前,则词首字母大写)。
ALT-U 将光标所在位置到词尾的所有字母转为大写。
ALT-L 将光标位置到词尾的所有字母转为小写。
ALT-R 取消所有变更,并将当前行恢复到在历史记录中的原始状态(前提是当前命令是从历史记录中来的,如果是手动输入,则会清空行)。
ALT-T 当光标两侧都存在词的时候,交换光标两侧词的位置。如:abc bcd -> bcd abc
ALT-. 使用前一次命令的最后一个词(命令本身也是一个词,参见后一篇的Bang命令中的词指示符概念)。
ALT-_ 同ALT-.。
ALT-数值 这个数值可以是正或者是负,这个键单独没有作用,必须后面再接其他内容,如果后面是字符,则表示重复次数。如:[ALT-10,k]则光标位置会插入10个k字符(负值在这种情况下无效);如果后面接的是命令,则数字会影响后面命令的执行结果,如:[ALT--10,CTRL-D]则向CTRL-D默认方向相反(负数)的方向执行10次操作。
ALT-< 移动到历史记录中的第一行命令。
ALT-> 移动到历史的最后一行,即当前正在输入的行(没有输入的情况下为空)。
ALT-P 从当前行开始向前搜索,有必要则向”上”移动,移动时,使用非增量搜索查找用户提供的字符串。
ALT-N 从当前行开始向后搜索,如果有必要向”下”移动,移动时,使用非增量搜索查找用户提供的字符串。
ALT-CTRL-Y 在标志点上插入前一个命令的第一个参数(一般是前一行的第二个词)。如果有参数n,则插入前一个命令的第n个词(前一行的词编号从0开始,见历史扩展)。负的参数将插入冲前一个命令的结尾开始的第n个词。参数n通过M-No.的方式传递,如:[ALT-0,ALT-CTRL-Y]插入前一个命令的第0个词(命令本身)。
ALT-Y 轮询到删除环,并复制新的顶端文本。只能在yank[CTRL-Y]或者yank-pop[M-Y]之后使用这个命令。
ALT-? 列出能够补全标志点前的条目。
ALT-* 把能够补全[ALT-?]命令能生成的所有文本条目插入到标志点前。
ALT-/ 试图对标志点前的文本进行文件名补全。[CTRL-X,/]把标志点前的文本当成文件名并列出可以补全的条目。
ALT-~ 把标志点前的文本当成用户名并试图进行补全。[CTRL-X,~]列出可以作为用户名补全标志点前的条目。
ALT-$ 把标志点前的文本当成Shell变量并试图进行补全。[CTRL-X,$]列出可以作为变量补全标志点前的条目。
ALT-@ 把标志点前的文本当成主机名并试图进行补全。[CTRL-X,@]列出可以作为主机补全标志点前的条目。
ALT-! 把标志点前的文本当成命令名并试图进行补全。进行命令名补全时会依次使用别名、保留字、Shell函数、shell内部命令,最后是可执行文件名。[CTRL-X,!]把标志点前的文本当成命令名并列出可补全的条目。
ALT-TAB 把标志点前的文本与历史记录中的文本进行比较以寻找匹配的并试图进行补全。
ALT-{ 进行文件名补全,把可以补全的条目列表放在大括号之间,让shell可以使用。

@solomonxie
Copy link
Owner Author

solomonxie commented Feb 8, 2018

Linux 创建多级目录 | 多层次文件夹

  • mkdir <folder> 创建单层文件夹, 比如mkdir ./src。不能创建多层,不能重复创建
  • mkdir -p <path> 创建多层次文件夹,可以重复创建同一个文件夹。如mkdir -p ./src/s/e/w/asdf

@solomonxie solomonxie added HF High frequency notes and removed Command Line labels Feb 9, 2018
@solomonxie solomonxie added this to the TOP NOTES milestone Feb 9, 2018
@solomonxie
Copy link
Owner Author

solomonxie commented Feb 10, 2018

❖ 命令行读取和写入剪切板图像数据

目前剪切板的操作原生支持还不是很完善,windows/mac/linux的工具都不一样,而且如果不是自己写脚本的话很难原生支持剪切板里的图片读取和写入。

Mac 自带pbcopy和pbpaste

# 写入剪切板
$ echo 'hihihi' | pbcopy
#
$ pbcopy < echo 'hello'

# 读取剪切板
$ pbpaste
# 保存剪切板内容到文件
$ pbpaste > ~/test.txt

Mac处理剪切板图像

目前没有原生支持剪切板的文字之外的类型。所以必须要下载第三方应用。

"pngpaste" 最简单的剪切板图像转文件工具

参考pngpaste

mac上直接brew install pngpaste,完成后一句pngpaste path-to-img.png即可在指定位置生成图片文件。没有特别option选项,仅此一句。
经过测试,能支持截图软件、浏览器、mac图片预览等的右键点击copy得来的常用图像。
官方的图像类型支持说明:
Supported input formats are PNG, PDF, GIF, TIF, JPEG.
Supported output formats are PNG, GIF, JPEG, TIFF.
Output formats are determined by the provided filename extension, falling back to PNG.
It's unclear if EXIF data in JPEG sources are preserved. There's an issue with pasting into JPEG format from a GIF source.

但是:

  • 不支持直接在文件上ctrl+c这样拷贝来的图片
  • 不支持gif,实测

Linux上的"xclip"

原本是在linux常用的剪切板操控工具,后来可能流行起来在mac也支持了。但是mac上安装要麻烦点,必须要先安装依赖工具:X11XQuartz,200M的安装文件,装完了还要重启mac电脑才行。不过为了剪切板的事,忍了。安装地址在这。下载好dmg文件安装就行了。
安装好后,用brew install xclip即可轻松装好。
但是!!!
装好才发现,xclip并没有和系统剪切板沟通,而只是在自己程序里的一些缓存。而且而且而且!每次在命令行里用xclip,还都会在桌面启动XQuartz这个app,还不会自动关闭。实在太不爽了这种设置。
另外,所有这些x开头的剪切板程序,都是建立在X Windows基础上的,即刚刚安装的XQuartz。wiki这里有一个列表,所有xsel、xclip等等都是这样的。。。
难道mac和linux的小小剪切板就这么难操作吗?

@solomonxie solomonxie changed the title Shells 命令行终端操作积累 Linux commands 命令操作积累 Feb 13, 2018
@solomonxie
Copy link
Owner Author

查看本地存储空间情况

$ df -h就可以查看本地各处的存储情况了。下图是我的树莓派存储:

image

@solomonxie solomonxie changed the title Linux commands 命令操作积累 Linux 命令行终端操作积累 Feb 13, 2018
@solomonxie
Copy link
Owner Author

solomonxie commented Feb 13, 2018

@solomonxie
Copy link
Owner Author

solomonxie commented Nov 21, 2018

❖ Linux/Mac 创建Ram Disk内存盘

把内存空间转换为本地使用的硬盘,加速文件读取。适用于处理高并发任务。

如果只是作为临时缓存的话,连数据库存储也可以放到Ram Disk中进行。(但是如果自己手动这样操作,还不如直接用Redis)

所以,参考Redis,内存盘在开发中还有各种的可能性可以供你去创造。

Mac创建Ram Disk

参考:How to Create a 4GB/s RAM Disk in Mac OS X

Mac上,需要用到diskutil命令和hdiutil命令,这个都是默认有的不需要安装:

$ diskutil erasevolume HFS+ 'RAM Disk' `hdiutil attach -nomount ram://204800`

其中ram://00000是代表分配的内存大小,以byte为单位。2048byte为1MB。

image

安装完后就会看到文件夹中多出一个磁盘:
image

尝试拷贝个文件后发现:100MB的文件拷贝进去只是一瞬间,连进度条都没有出现!

删除内存盘:
先用df -h找到磁盘的所在位置,比如我的是/dev/disk5
然后卸除挂载需执行:

hdiutil detach disk5

image

如果报busy,那么就用各种方法关闭相关的文件夹、终端shell等,再来执行。

Ubuntu创建Ram Disk

参考:How to use a ramdisk on Linux

mkdir ~/ramdisk

# 分配/挂载内存盘
sudo mount -t tmpfs -o size=200M tmpfs ~/ramdisk

# 卸载/删除内存盘
sudo umount ~/ramdisk

其中tmpfs是内存,我们随便创建了一个文件夹就可以挂载上去。

可以看到,我们从内存中分了200MB出来作为本地磁盘使用:
image

Linux分配内存盘实在太方便了。

开机自动挂载Ram Disk

直接修改/etc/fstab文件,加入以下:

none /home/ubuntu/ramdisk tmpfs nodev,nosuid,noexec,nodiratime,size=200M 0 0

定期备份内存盘

直接在crontab里面添加*/15 * * * * cp -ru /home/ubuntu/ramdisk /home/ubuntu/backup

@solomonxie
Copy link
Owner Author

solomonxie commented Dec 4, 2018

❖ Linux/Unix 编译安装软件源代码的最佳实践 [DRAFT]

Subtitle: Linux / Unix Build Software From Source Code Best Practice

*nix下编译安装开源软件是新手的一大痛。鉴于我胆小怕事、在正式学习前不随便使用新东西的心态,用了Linux很多年后现在才开始正式学习怎么编译一个新版本的开源软件。因为迫于跟不上新版本、包管理器不支持某些硬件平台等原因,现在已经到了不编译不行的地步,所以扛不住了,开始学习!

理解软件编译

源代码下载的话,基本上都是到Github直接下载zip或tar包即可。

常用的需要编译的开源软件主要指C或C++开发的软件。

一般编译这些软件主要有这几步:

  • ./configure - 检测本机当前的环境,看看是否满足权限和依赖包等。
  • make - 把源代码编译成二进制文件
  • make install - 把各个二进制文件和配置文件等复制到对应的目录
  • make uninstall - 卸载(删除) make install时存到各个目录的文件。(如果Makefile中定义了才能用)

Dependency Hell

软件编译的最大问题就是依赖。遇到Dependency Hell,绝对是大概率事件。

/usr/local vs. /opt [DRAFT]

对于自己编译的软件安装到哪里,可以比得上Vim vs. Emacs之争了。

简单来说:

  • /usr/local -
  • /opt -

总结

./configure --prefix=/opt/MyProgram && echo [  OK  ]
make && echo [  OK  ]
sudo make install && echo [  OK  ]

每一句是完全隔离是因为这样能更清晰的知道错误出现在哪里。
每一句后面打印[ OK ]是为了更方便看到知道命令是否产生错误。

@solomonxie
Copy link
Owner Author

solomonxie commented Dec 4, 2018

编译安装FFmpeg [DRAFT]

参考官方:Compile FFmpeg for Ubuntu, Debian, or Mint

编译安装FFmpeg不光是需要编译它本身,还需要编译安装一系列的视频处理器。
基本安装步骤:

  • 安装后面编译所需的依赖:autoconf automake build-essential cmake git-core libass-dev libfreetype6-dev libsdl2-dev libtool libva-dev libvdpau-dev libvorbis-dev libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev pkg-config texinfo wget zlib1g-dev
  • 编译安装视频处理器:
    • NASM
    • YASM
    • libx264
    • libx265
    • libvpx
    • libfdk-aac
    • libmp3lame
    • libopus
    • libaom
  • 编译安装FFmpeg本身

注意:lib265libaom这两个高清编码器,对于树莓派这种小机器来说还是有点费劲了。所以目前也很难找到正确能编译安装上的方式。

# Download
cd /tmp
wget https://github.com/FFmpeg/FFmpeg/archive/n4.1.tar.gz
tar -xzvf n4.1.tar.gz
cd n4.1*

# Build
./configure --prefix=/opt/ffmpeg-4.1  && echo OK.
make && echo OK.
sudo make install  && echo OK.

MacOS编译问题

Error: nasm/yasm not found or too old.

查看了下本机的yasm版本$ yasm --version,发现是1.3.0。
所以就用homebrew重新安装了一下:

$ brew instlal yasm

得到的版本是1.3.0.1。

@solomonxie
Copy link
Owner Author

solomonxie commented Dec 4, 2018

@solomonxie
Copy link
Owner Author

solomonxie commented Dec 6, 2018

❖ Mac安装包管理器MacPorts:从入门到放弃

安装

MacPorts的pkg安装包经常遇到的问题是:卡住不动。不用想也知道是网络问题。

不过经过多次尝试,最好的做法还是直接自己编译:

# Download
cd /tmp
sudo curl -O https://distfiles.macports.org/MacPorts/MacPorts-2.5.4.tar.bz2
sudo tar xf MacPorts-2.5.4.tar.bz2

# Build
cd MacPorts-2.5.4/
./configure --prefix=/opt/macports-2.5.4   && echo "[ OK ]"
make   && echo "[ OK ]"
sudo make install   && echo "[ OK ]"

# Export Path or Create symlink
echo "export PATH=/opt/local/bin:/opt/local/sbin:$PATH" >> ~/.bash_profile
# or
ln -s /opt/local/bin/port /usr/local/bin/port

更新:

sudo port selfupdate

安装:

sudo port install ffmpeg

体积

在都还没装什么软件的时候(只装了一个ffmpeg),整个macports的目录就高达3.5GB,这个在MBA笔记本上来说实在是太重了!而且编译一个ffmpeg,用了半个小时还没完成,这实在是匪夷所思。
注:和网络没关系,镜像已经设为了国内的。看时间卡住的,纯在Build上。

想着,既然安装一个都这么费劲,还不如自己compile。

@solomonxie
Copy link
Owner Author

Apt包管理器常用命令

apt包管理器有很多命令可以使用:

  • apt
  • apt-get
  • apt-cache
  • dpkg

显示已安装的某包具体信息:

$ apt-cache show 包名

显示已用apt-get安装的某包的所有安装位置:

$ dpkg -S 包名

@solomonxie
Copy link
Owner Author

solomonxie commented Dec 11, 2018

❖ Linux 压缩包 [DRAFT]

.zip

解压:unzip FileName.zip
压缩:zip FileName.zip DirName

解压多个文件到各自独立目录:
参考:https://askubuntu.com/questions/518370/extract-several-zip-files-each-in-a-new-folder-with-the-same-name-via-ubuntu-t

for i in *.zip; do unzip "$i" -d "${i%%.zip}"; done

———————————————

.tar

解包:tar xvf FileName.tar
打包:tar cvf FileName.tar DirName
(注:tar是打包,不是压缩!)
———————————————

.gz

解压1:gunzip FileName.gz
解压2:gzip -d FileName.gz
压缩:gzip FileName

.tar.gz 和 .tgz

解压:tar xzvf FileName.tar.gz
压缩:tar czvf FileName.tar.gz DirName
———————————————

.bz2

解压1:bzip2 -d FileName.bz2
解压2:bunzip2 FileName.bz2
压缩: bzip2 -z FileName

.tar.bz2

解压:tar xjvf FileName.tar.bz2
压缩:tar cjvf FileName.tar.bz2 DirName
———————————————

.bz

解压1:bzip2 -d FileName.bz
解压2:bunzip2 FileName.bz
压缩:未知

.tar.bz

解压:tar xjvf FileName.tar.bz
压缩:未知
———————————————

.xz

解压1:xz -d FileName.xz
压缩:

———————————————

.tar.xz

解压1:xz -d FileName.tar.xz && tar -xvf FileName.tar
解压2:tar -xJvf FileName.tar.xz
压缩:

———————————————

.Z

解压:uncompress FileName.Z
压缩:compress FileName
.tar.Z

解压:tar xZvf FileName.tar.Z
压缩:tar xZvf FileName.tar.Z DirName
———————————————

.rar

解压:rar x FileName.rar
压缩:rar a FileName.rar DirName
———————————————

.lha

解压:lha -e FileName.lha
压缩:lha -a FileName.lha FileName
———————————————

.rpm

解包:rpm2cpio FileName.rpm | cpio -div
———————————————

.deb

解包:ar p FileName.deb data.tar.gz | tar zxf -
———————————————

.tar .tgz .tar.gz .tar.Z .tar.bz .tar.bz2 .zip .cpio .rpm .deb .slp .arj .rar .ace .lha .lzh .lzx .lzs .arc .sda .sfx .lnx .zoo .cab .kar .cpt .pit .sit .sea

解压:sEx x FileName.*
压缩:sEx a FileName.* FileName

@solomonxie
Copy link
Owner Author

solomonxie commented Dec 12, 2018

Linux进程管理 [DRAFT]

查看进程

# 常用:
ps aux

# 直接根据进程名查看进程ID:
pgrep zsh

关闭进程

# 关闭单个进程
kill <进程ID>

# 关闭所有进程
pkill <进程名>

#
killall <进程名>

#
pgrep <进程名> |xargs kill

@solomonxie
Copy link
Owner Author

solomonxie commented Dec 15, 2018

❖ CLI命令行模糊搜索的超强大工具:fzf

参考官方:junegunn/fzf
参考:Fuzzy finder(fzf+vim) 使用全指南
参考:模糊搜索神器fzf

image

无需复杂配置,非常简单就能使用:

git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install

安装过程,只是简单的分别在zshrcbashrc等各个shell的配置文件中加入如下内容(已简化):

# 将可执行文件加入PATH
if [[ ! "$PATH" == *~/.fzf/bin* ]]; then export PATH="$PATH:$HOME/.fzf/bin"; fi
# 引入shell中的"**"符号自动补全
[[ $- == *i* ]] && source "$HOME/.fzf/shell/completion.zsh" 2> /dev/null  # Auto-completion
# 引入shell中的快捷键设置
source "$HOME/.fzf/shell/key-bindings.zsh" # Key bindings
# 外观设置(高亮、预览、高度)
export FZF_DEFAULT_OPTS="--height 40% --layout=reverse --preview '(highlight -O ansi {} || cat {}) 2> /dev/null | head -500'"

安装好后,直接调用fzf即可打开搜索。

为了更方便,我们应该在zsh或bash的配置文件中加入alias fzf="~/.fzf/bin/fzf"

输入fzf命令后,自动会显示出搜索框。基本操作命令如下:

  • 上下移动:Ctrl+J / K 或 Ctrl+N / P
  • 退出:Enter键选中,或 Esc,或Ctrl+c, 或Ctrl+g
  • 多选:在多选模式下(-m), TAB和Shift-TAB用来多选
  • 鼠标: 上下滚动,双击选中; Shift-click或shift-scoll用于多选模式
  • 预览:shift+上/下键,滚动预览内容

使用命令

fzf命令在搜索后,当你选择时,只会返回你这个文件的全路径字符串。也就是:fzf默认会从STDIN读入数据,然后将结果输出到STDOUT

我们当然不能拿字符串来做什么。所以还是要配合各种文字编辑、shell命令等来使用。

用VIM编辑搜索到的结果文件:

$ vim $(fzf)

# 可以将alias设置为:
alias vfzf="vim $(fzf)"

效果如下:
v2-54208c2f5675c44dc312827a271743f6_b

切换到某个目录,可以完成切换到当前以下任意目录的效果:

$ cd $(find * -type d | fzf)

# 建议alias设置:
alias dfzf="cd $(find * -type d | fzf)"

每次移动光标,可以快速看到文件预览:

$ fzf --preview 'head -100 {}'

效果如下:
image

配置

如果要更方便的使用fzf,而不输入那么多命令,那就直接在shell的配置里加一个环境变量即可。

这个环境变量名叫FZF_DEFAULT_OPTS,所有fzf的配置都写在这一个变量里:

export FZF_DEFAULT_OPTS="--height 40% --layout=reverse --preview '(highlight -O ansi {} || cat {}) 2> /dev/null | head -500'"

由于fzf安装时候会自动在你的zshrcbashrc中加入[ -f ~/.fzf.zsh ] && source ~/.fzf.zsh,不是很直观。如果想更直观更可控,可以直接把.fzf.zsh中为数不多的内容复制到zshrc中集中管理:

# Setup fzf Searching tool {
    # Import binary execution to PATH
    if [[ ! "$PATH" == *~/.fzf/bin* ]]; then export PATH="$PATH:$HOME/.fzf/bin"; fi
    # Import key bindings for auto completion
    [[ $- == *i* ]] && source "$HOME/.fzf/shell/completion.zsh" 2> /dev/null
    # Import specific key bindings
    source "$HOME/.fzf/shell/key-bindings.zsh"
    # Setup appearence (Highlighting, scale, preview...)
    export FZF_DEFAULT_OPTS="--height 40% --layout=reverse --preview '(highlight -O ansi {} || cat {}) 2> /dev/null | head -500'"
# }

搜索语法

@solomonxie
Copy link
Owner Author

solomonxie commented Dec 18, 2018

❖ Linux 搜索工具 [DRAFT]

文件搜索程序候选列表

  • find
  • fd: 实现find的80%功能,速度更快,增加忽略文件功能

Mac安装:

brew install fd

Ubuntu安装:

sudo apt-get install fd-find

文本搜索候选列表

  • grep
  • sed
  • awk
  • ack
  • ag: The Silver Searcher. 比ack快
  • rg: RipGrep. 搜索代码和ag同速,比ack快3-5倍
  • sift
  • ucg
  • pt

测试——在整个Linux内核源码中执行搜索效率:

image

文件搜索:fd命令

fd能实现find的80%功能,速度更快,增加忽略文件功能

Mac安装:

brew install fd

Ubuntu安装:

sudo apt-get install fd-find

常用命令:

- Find files matching the given pattern in the current directory:
    fd pattern

- Find files that begin with "foo":
    fd '^foo'

- Find files with a specific extension:
    fd --extension txt

- Find files in a specific directory:
    fd pattern path/to/dir

- Include ignored and hidden files in the search:
    fd --hidden --no-ignore pattern

文本搜索:ag命令

ag的特点:

  • 非常快
  • 能够搜索整个文件夹的所有文件
  • 搜索结果高亮美化显示

Mac安装:

brew install ag

常用命令:

- Find files containing "foo", and print the line matches in context:
    ag foo

- Find files containing "foo" in a specific directory:
    ag foo path/to/folder

- Find files containing "foo", but only list the filenames:
    ag -l foo

- Find files containing "FOO" case-insensitively, and print only the match, rather than the whole line:
    ag -i -o FOO

- Find "foo" in files with a name matching "bar":
    ag foo -G bar

- Find files whose contents match a regular expression:
    ag '^ba(r|z)$'

- Find files with a name matching "foo":
    ag -g foo 

简单一句ag 关键字 ./就搜索当前文件夹,看一下搜索效果:

image

@solomonxie
Copy link
Owner Author

solomonxie commented Dec 18, 2018

Linux 查看CPU温度

每种设备查看温度的方式都不同。

树莓派

无需安装工具即可查看:

cat /sys/class/thermal/thermal_zone0/temp
>>> 62838

# 或者直接以度为单位显示
echo $[$(cat /sys/class/thermal/thermal_zone0/temp)/1000]°
>>> 63

显示数字为千分之一度。所以说,除以1000就是当前温度值。

可以设置watch实时观看:

watch -n 0.1 echo CPU: $[$(cat /sys/class/thermal/thermal_zone0/temp)/1000]°

image

PC

直接查看:

# 查看第一个核心
$ cat /proc/acpi/thermal_zone/TZS0/temperature

# 查看第二个核心
$ cat /proc/acpi/thermal_zone/TZS1/temperature

lm_sensors

Ubuntu:

# 安装
sudo apt-get install lm-sensors -y
yes | sudo sensors-detect
# 运行
sensors

@solomonxie
Copy link
Owner Author

<M-e>键的问题

初看,并不明白在键盘上是什么?Google了很久也查不到。最后终于在查关键字Vim Key Notation发现了,原来<M>代表Meta key,在很多终端或平台是不支持的。偶尔有支持的,那就是Alt键。这个时候,它和<A-..>是同样的意思。

但是,自动补全括号中,有一个fast wrap功能,需要用到<M-e>键,即Alt-e键。可是不管怎么按,在insert还是normal模式按,都只会输出一个奇怪符号´,而不执行命令。

为什么?
因为Alt快捷键,在很多Terminal或平台都是不支持的,比如Mac的终端。

经过一番查询,Mac的iTerm2可以将Alt(Option)键映射为Meta键。
位置为:Preference -> Profiles -> Keys -> Left Option key -> ESC+.

image

@solomonxie
Copy link
Owner Author

ZSH安装超酷的powerlevel9k主题

网上看到别人的命令行右面竟然有个漂亮的时间戳,非常好奇。搜了下发现竟然是zsh的主题,叫powerlevel9k

image

参考Github官方文档:https://github.com/bhilburn/powerlevel9k

安装

有了Oh my zsh的话就安装非常简单,
如下两步:

  • 下载主题
$ git clone https://github.com/bhilburn/powerlevel9k.git ~/.oh-my-zsh/custom/themes/powerlevel9k
  • ~/.zshrc的首行处引入主题(真的需要写在首行才能保证不出问题,所有主题都一样):
ZSH_THEME="powerlevel9k/powerlevel9k"

色彩问题

安装后有可能会提示你的终端色彩不够256色问题,
image

可以找它建议的,直接在~/.zshrc中强制指定终端色彩来解决:

export TERM="xterm-256color"

image

常用配置

默认配置参考官方说明:https://github.com/bhilburn/powerlevel9k/wiki/Stylizing-Your-Prompt
官方推荐的各种用户配置(带各种截图):https://github.com/bhilburn/powerlevel9k/wiki/Show-Off-Your-Config

# ==== Theme Settings ====
# PowerLevel9k
# 左侧栏目显示的要素(指定的关键字参考官网)
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(os_icon context dir vcs)
# 右侧栏目显示的要素
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status root_indicator background_jobs time virtualenv)
#新起一行显示命令 (推荐!极其方便)
POWERLEVEL9K_PROMPT_ON_NEWLINE=true
#右侧状态栏与命令在同一行
POWERLEVEL9K_RPROMPT_ON_NEWLINE=true
#缩短目录层级
POWERLEVEL9K_SHORTEN_DIR_LENGTH=1
#缩短目录策略:隐藏上层目录中间的字
#POWERLEVEL9K_SHORTEN_STRATEGY="truncate_middle"
#添加连接上下连接箭头更方便查看
POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX=""
POWERLEVEL9K_MULTILINE_LAST_PROMPT_PREFIX=""
# 新的命令与上面的命令隔开一行
#POWERLEVEL9K_PROMPT_ADD_NEWLINE=true
# Git仓库状态的色彩指定
POWERLEVEL9K_VCS_CLEAN_FOREGROUND='blue'
POWERLEVEL9K_VCS_CLEAN_BACKGROUND='black'
POWERLEVEL9K_VCS_UNTRACKED_FOREGROUND='yellow'
POWERLEVEL9K_VCS_UNTRACKED_BACKGROUND='black'
POWERLEVEL9K_VCS_MODIFIED_FOREGROUND='red'
POWERLEVEL9K_VCS_MODIFIED_BACKGROUND='black'

Python的Virtualenv和Pipenv虚拟环境显示问题

一般命令行里,进入虚拟环境的shell时会显示如(venv) ~$ 这样的。
但是安装这个主题后,默认是没有的。
你必须手动设置添加才行。

方法是:
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS或者POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS中添加virtualenv要素,就能够显示了。
如:

POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(os_icon context dir vcs virtualenv)

image

但是也有不能正常显示的时候,而且还会报错:

$ pipenv shell
Shell for UNKNOWN_VIRTUAL_ENVIRONMENT already activated.
No action taken to avoid nested environments.

这个不是主题的问题,测试后发现换了主题还是这样显示,所以这是ZSH的问题。
找了半天都没有结果怎么解决。
结果发现,不需任何修改,

只要关闭当前的终端窗口,重新打开就好了。

显示主机型号图标问题

像这种显示当前主机(如Mac)图标和Git图标的问题,是需要字体支持的。

image

默认是不开启的,必须要在~/.zshrc中指定使用这种方式显示:

#字体设定 (注意,字体设定必须放在主题之前)
POWERLEVEL9K_MODE='nerdfont-complete'
#主题设定
ZSH_THEME="powerlevel9k/powerlevel9k"

上面的字体模式可选的有:

  • nerdfont-complete
  • awesome-fontconfig
  • awesome-patched

根据你的情况来尝试,因为不是每个都能完美无乱码显示出来。

@solomonxie
Copy link
Owner Author

solomonxie commented Jan 13, 2019

ZSH不支持*星号匹配符

Bash中,我们经常会用这些语句:

find . -name *.txt

apt-get remove mysql*

rm /tmp/*.jpg

然后在zsh中,经常会无法解析*通配符,产生这个错误:

zsh: no matches found

解决方法很简单,在~/.zshrc中加入setopt no_nomatch即可。

@solomonxie
Copy link
Owner Author

Linux查看某个文件或命令的真实全路径

简单的使用*nix内置命令:realpath

文件/文件夹/链接:

# FILE
$ realpath README.md
/home/pi/project/README.md

# SYMLINK
$ realpath ~/.vimrc
/home/pi/dotfiles/vim/vimrc-mini

命令:

$ which vim
vim: aliased to vim8
$ which vim8
/usr/bin/vim8

$ realpath $(which vim)
/opt/vim-8.1/bin/vim

我们可以看到,在查看命令的位置上,which是不太可靠的,因为它只会显示出链接别名,而不显示真实地址。

@solomonxie
Copy link
Owner Author

solomonxie commented Jan 22, 2019

Busybox的安装包管理器opkg [DRAFT]

opkg是OpenWrt系统下的安装包管理器,相当于Ubuntu的apt,或CentOS的yum,或Mac的Homebrew

使用方法:

# 更新
$ opkg update

# 查看已安装软件
$ opkg list-installed
$ opkg list

# 安装指定软件
$ opkg install 包名

但是,opkg目前只支持少量的软件。如果要查看当前支持哪些软件安装,可以查看这个目录下的各个文件。其中每个文件代表一个提供源:

$ cat /var/opkg-lists/barrier_breaker

$ cat /var/opkg-lists/openwrtio

更改安装源/etc/opkg.conf


参考:OpenWrt.io - opkg 软件源

常用的软件安装:

$ opkg install tcpdump

@solomonxie
Copy link
Owner Author

solomonxie commented Jan 31, 2019

Ranger:帅气强大的命令行文件管理器 [DRAFT]

Ranger是一个极轻量(700k)又像VIM一样高可配置的命令行文件管理器,用起来很多时候比桌面上的文件夹方便多了。

参考:Installing and Using Ranger, a Terminal File Manager, on a Ubuntu VPS
参考官方:ranger/ranger - A VIM-inspired filemanager for the console
参考Luke Smith: RANGER: the aesthetic way to manage files on Linux

为什么要用Ranger
因为终端里,你可能真的会厌倦了各自cd, cp, mv, rm等等。如果有桌面上那种快捷又直观的方式,加上各自超级方便如Vim的快捷键,你肯定会乐于接受。

Ranger就是这种能给你带来终端里舒服体验的轻量又强大的文件管理器。

image

Mac安装:

$ brew install ranger

Ubuntu安装:

$ sudo apt-get install ranger

运行:

$ ranger

刚刚安装好后,颜色都是默认的:

image

基本使用

通用快捷键:

  • ? 显示帮助
  • 1? 快捷键帮助
  • 2? 命令帮助
  • 3? 设置帮助
  • S 进入当前文件夹 (前提是要按Enter选择文件夹)
  • R 重新加载当前文件夹
  • Q 退出

移动键:

  • h,j,k,l 上下左右移动。和Vim一样,很快就能学会
  • J, K 向上或向下翻半页
  • H, L 根据历史向前或向后跳转
  • gg到顶部,G到底部
  • <Ctrl>-b向上翻页Backward,<Ctrl>-f向下翻页Forward

文件夹操作:

  • gh = cd ~
  • gge = cd /etc
  • ggu = cd /usr
  • ggd = cd /dev
  • ggo = cd /opt
  • ggv = cd /var
  • ggm = cd /media
  • ggM = cd /mnt
  • ggs = cd /srv
  • ggr = cd /
  • ggR = cd to ranger's global configuration directory

文件操作:

  • i 预览文件
  • E 打开文件(用终端默认程序,如Vim)
  • r 打开文件(提示输入用哪种命令行程序打开)
  • o 改变排列方法(会弹出排序选项)
  • z 更改设定
  • zh 显示/隐藏文件
  • <space> 选择当前文件
  • t 给文件打上tag标记
  • cw 重命名文件
  • / 搜索文件
  • n 跳至下一个搜索的匹配文件
  • N 跳至上一个搜索的匹配文件
  • yy 复制文件
  • dd 剪切文件
  • dD 删除文件
  • IA 文件改名

Tab标签窗口:

  • <Ctrl>-n 创建新Tab
  • <Ctrl>-w 关闭当前Tab
  • <Tab> 下一个Tab
  • <Shift><Tab> 前一个Tab

在Shell中cd进入Ranger选中的文件夹路径:

S (大写),ranger就会退出,并且在shell中cd进入该路径。

基本配置

参考详细配置:ranger - Archlinux

首先需要“生成配置文件“:

$ ranger --copy-config=all

然后ranger就会把系统级的配置文件保存的当前用户文件夹下的~/.config/ranger/目录中。其中包括5个配置文件:

  • apps.py
  • commands.py
  • rc.conf 主要配置文件,如同vimrc
  • options.py
  • scope.sh 用来设定如何预览各种文件的,包括图片

色彩配置

如同Vim一样,可以直接按:输入命令,查看效果,确定后再写入配置文件。

设置颜色主题的命令和vim一样:set colorscheme NAME
默认的主题只有:default, jungle, snow, solarized.

自定义的主题放在~/.config/ranger/colorschemes/文件夹中即可识别。

去哪找主题?
官方并没有推荐任何主题网站,也没有说明任何主题安装方法等。
通过摸索发现,不要搜ranger colorscheme,而是在Github搜索ranger theme即可获得各种主题。

安装第三方主题方法:
只要把xx.py拷贝至~/.config/ranger/colorschemes/文件夹下即可。然后在rc.conf中设定主题名称。

推荐一款主题:RougarouTheme/ranger

image

安装方法:

mkdir -p ~/.config/ranger/colorschemes/
wget https://raw.githubusercontent.com/RougarouTheme/ranger/master/rougarou.py -P ~/.config/ranger/colorschemes/

然后在~/.config/ranger/rc.conf中的主题设定处改为set colorscheme rougarou,重启ranger即可。

插件安装使用

Ranger可以有很多种在命令行下预览图片等文件的方法,这都需要安装第三方程序才行。

参考:ranger的配置与使用

Ubuntu上,可以安装这些插件进行预览:

$ sudo apt-get install caca-utils # img2txt 图片
$ sudo apt-get install highlight  # 代码高亮
$ sudo apt-get install atool     # 存档预览
$ sudo apt-get install w3m        # html页面预览
$ sudo apt-get install poppler    # pdf预览
$ sudo apt-get install mediainfo  # 多媒体文件预览
$ sudo apt-get install catdoc     # doc预览
$ sudo apt-get install docx2txt   # docx预览
$ sudo apt-get install xlsx2csv   # xlsx预览

图片预览 [DRAFT]

image

全真彩色图片的预览,需要第三方的支持:

  • Linux上,需要安装w3m命令行浏览器才有。
  • Mac上,直接用iTerm2即可实现全彩色预览。

添加文件图标:ranger_devicons插件

参考官方:alexanderjeurissen/ranger_devicons

image

添加插件方法:

cd /tmp
git clone https://github.com/alexanderjeurissen/ranger_devicons.git
cd ranger_devicons/
make install && echo [  OK  ]

# UNINSTALL
# make uninstall

体验:
非常简单也非常好看。安装方便、卸载方便。虽说是make install,但其实什么都没编译只是自动在rc.conf中加入相应内容而已。

只有一个问题,比如Vim中嵌入了Ranger插件,那么图标就会显示乱码。

@solomonxie
Copy link
Owner Author

solomonxie commented Jan 31, 2019

W3M:超酷的命令行浏览器! [DRAFT]

超酷不是说这个网页浏览器显示效果多酷,而是在命令行终端里浏览网页这件事非常酷!

试想一下:
你可以SSH进远程的服务器,任意浏览服务器“所在地”的网页,而不用建立任何隧道,这是什么体验?

当然,既然是命令行里的,也不要对排版有太大期待。可以说,所有的CSS和JS都是失效的,只是简化版的HTML展示。
但一些常用的功能如填写表格,搜索,链接跳转等,都还是能轻松实现的。

Mac安装:

$ brew install w3m

Ubuntu安装:

$ sudo apt-get install w3m

安装包才2M+,轻量到让我惊讶的地步。

浏览某个网页的方法:

$ w3m google.com

image

默认的情况下,是不会展示网页中图片和视频的,需要我们额外进行配置。

基本操作

参考:文本浏览器w3m

浏览网页图片

修改浏览器属性

有时候我们访问网页,不想让网站知道我们是在用w3m浏览器,而是想让人知道我用的是Chrome浏览器。那么就需要修改User-Agent

修改方法是在~/.w3m/config文件中,找到user_agent处,加入自己想要的agent,如:

user_agent Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36

然后用w3m https://www.whatsmyua.info/命令打开网页,看看自己的User-Agent是不是改了呢。

@solomonxie
Copy link
Owner Author

solomonxie commented Jan 31, 2019

❖ Awesome Linux Lightweight Programs [DRAFT]

Axel 超强超速多线程的下载器 代替wget

Mac安装:

brew install axel

Ubuntu安装:

sudo apt-get install axel

使用:

$ axel <URL>

指定线程数:

$ axel -n 10 <URL>

效果:

image

如果遇到SSL error: certificate verify failed错误,解决方法是-k参数“禁止安全检查“,相当于wget的--no-check-certificate,方法如下:

$ axel -k <URL>

@solomonxie
Copy link
Owner Author

solomonxie commented Feb 1, 2019

Homebrew 备份所有brew安装过的程序

为什么需要备份?

  • 重装系统
  • 因为卸载了Homebrew而丢掉了所有程序

新版Homebrew已经可以很方便的备份所有用Homebrew安装过的程序了。
需要用到Homebrew/homebrew-bundle这个程序。

参考:Homebrew/homebrew-bundle
参考:Restore, Clone or Backup your Homebrew Setup

备份:

# 先安装
brew bundle dump

# 再运行一遍执行
brew bundle dump

这时候,会在当前目录生产一个Brewfile的文件,记录了所有已安装的程序。

大概内容如下:

tap "homebrew/bundle"
tap "homebrew/core", "https://github.com/Homebrew/homebrew-core.git"
brew "autojump"
brew "axel"
brew "ctags"
brew "git"
brew "neovim", link: false
brew "pngpaste"
brew "python"
brew "python@2"
brew "ranger"
brew "reattach-to-user-namespace"
brew "tmux"
brew "w3m"

把它保存在自己备份文件的地方。

恢复安装的时候,只需要进入Brewfile所在文件夹,执行:

$ brew bundle

@solomonxie
Copy link
Owner Author

solomonxie commented Feb 3, 2019

nnn 真正极简主义的命令行文件管理器 [DRAFT]

参考官方:jarun/nnn
参考官方推荐的视频教程:Luke Smith - I'M GOING TO USE THE NNN FILE BROWSER!

image

nnn相对Ranger来讲,界面真的是极简,速度也能感觉到明显提升:完全无卡顿。
nnn真正贴合了命令行里快速浏览文件夹的需求:稳准狠。
nnn的安装又简单又轻量(55K),对各种OS的支持又多到发指。

奇怪的是:nnn是Python开发的,但是速度竟然快到这种程度,是很让人惊讶的。

常用安装:
Mac:brew install nnn
Ubuntu: sudo apt-get install nnn

安装好后直接输入nnn命令就进入一个小小的文件夹浏览界面了。也可以nnn ~/myfolder进入指定文件夹。

基本操作(类似vim):

  • h,l,进行父级子级目录切换,非常快!
  • j,k进行上下移动
  • /筛选

文件的选择(类似平常用的Ctrl-c):

  • 单选:按<Space>选中某个文件或文件夹
  • 多选:先按大写Y开启多选模式,然后按<Space选中多个文件。
  • 查看已选:按小写y查看已选文件列表。

文件复制、移动、删除(在已选中文件前提下):

  • Copy: 按大写P粘贴该文件。
  • Move: 按大写V移动该文件。
  • Delete: 按大写X删除。

文件重命名:

  • 重命名单个文件:Ctrl-r
  • 重命名多个文件:需要安装vidir程序才能用。

列表排序:

  • 按时间排序:按t
  • 按文件或文件夹大小排序:按s
  • 按文件大小排序:直接按S
  • 按占用磁盘大小排序:按Ctrl-J

建议不要按照文件大小排序,否则每次进入目录前都会执行du命令计算所有子文件和文件夹才能进入。

编译安装方法

树莓派Raspbian18.04也不支持nnn,所以试着编译安装。

cd  /tmp
wget https://github.com/jarun/nnn/archive/v2.2.tar.gz
tar xzvf v2.2.tar.gz
cd nnn-*

sudo apt-get install pkg-config libncursesw5-dev libreadline6-dev -y
make
sudo mv ./nnn /usr/local/bin

因为程序极轻量,所以就在原地生成一个nnn单二进制文件,也就是全程序。
然后直接把nnn文件移动到本地自己喜欢到bin目录即可开始用了。

@solomonxie
Copy link
Owner Author

solomonxie commented Feb 8, 2019

❖ Linux下「发送」邮件的命令行应用

发送邮件有超多种方法,但是接收邮件就要麻烦很多。所以这里先只讲发送邮件

先说明下:不管是什么邮件客户端,都是可以直接发邮件的。但是,因为默认的话,发件人是很随便地设置成你本机地名字。并且**100%**会被邮箱当成垃圾邮件处理。如果你去垃圾箱里找,还是可以看到的。这就是为什么,我们还是需要配置它,让它登录某个邮箱来使用它的身份发邮件了,比如gmail邮箱或阿里云邮箱。(国内的163和qq邮箱都已经屏蔽第三方客户端登录了)

另注:为什么如今这么电子技术这么发达的年代,命令行邮件终端相关的应用和文章还这么少几乎都是很多年前的?我想是因为:python等都已经能很好很方便支持发邮件了,没必要折腾命令行版本。
事实上,试过就知道:为什么这些客户端会被抛弃了。。。请看下面我入的坑:

「Mail」和「Sendmail」

注:Mail的配置相当麻烦,网上找文章也寥寥无几,有也都是十几年前的东西。所以建议放弃,使用更先进的客户端。

「Mutt」

Mutt是Linux邮箱客户端榜上有名的利器了。

注意:这里不介绍Mutt作为邮件客户端的界面操作,而是直接作为命令行的命令来操作。

为什么?因为我们用命令行的邮箱客户端都是用来自动化的,一般来说不太需要终端的邮箱界面。

参考:Linux使用mutt发送邮件

安装

其中mutt是软件本身,msmtp是用来帮助发件的工具。

# Linux
$ sudo apt-get install mutt msmtp

# 或Mac
$ brew install mutt msmtp

配置

你需要配置两个文件,一个是~/.muttrc用来配置Mutt本身,一个是~/.msmtprc用来配置发件人的,需要写入密码一类的。

参考:Linux下使用mutt,msmtp发信

配置~/.msmtprc:

account     Aliyun
host        smtp.aliyun.com
from        jason@aliyun.com
auth        login
user        jason@aliyun.com
password    abcde123123123
account default : Aliyun
logfile ~/.msmtp.log

然后必须修改~/.msmtprc文件的权限,否则程序无法读取,发邮件时会报错。修改如下:

chmod 600 ~/.msmtprc

配置~/.muttrc

set sendmail="/usr/bin/msmtp"
set use_from=yes
set realname="Jason"
set from="Jason@aliyun.com"
set envelope_from=yes
set editor="vim -nw"

注意:第一条set sendmail中的位置不一定是这样的,在Mac和Linux上都会不同,所以需要用which msmtp来找到它的真实位置,再填进去。

关于配置的解释可以看这里:
image

发送邮件命令格式

注意:收件人的地址前一定要明确指定参数名--,如下所示。否则无法正确发送附件。

# 常用格式如下 -s   “标题”  -c    抄送  -a  附件
$ echo “HELLO WORLD” | mutt -s “TITLE” -- RECIPIENT@gmail.com

# 发送HTML格式漂亮的邮件
$ mutt -- RECIPIENT@gmail.com -e 'set content_type="text/html"' -s "TITLE" < out.html

# 发送给多人,抄送,添加附件
$ echo "hello" | mutt -s "TITLE" aaa@gmail.com, bbb@gmail.com -c ccc@gmail.com -a /home/pi/pic.jpg address="RECIPIENT@gmail.com"

# 发送邮件时设置邮件的文本类型为:html格式,邮件的等级为:重要
$ echo $content | mutt  -s "${subject}" -e 'set content_type="text/html"' -e 'send-hook . "my_hdr  X-Priority: 1"' $address

语法:
image

参数:
image

Mutt发送HTML漂亮富文本邮件

默认语法是:

$ mutt -- RECIPIENT@gmail.com -e 'set content_type="text/html"' -s "TITLE" < out.html

但是,值得注意的是,语法虽然简单,可一旦你本机的mutt版本不对,邮件将无法显示出正确的格式,而只是无尽的html源代码。
通过mutt -v可以看到,发送出显示正常的邮件的mutt版本是在树莓派上安装的Mutt 1.5.23 (2014-03-12)。而不成功的是在Mac上的Mutt 1.9.5 (2018-04-13),反而是最新的版本!

邮箱配置

- 新浪@sina.com邮箱,
接收服务器地址为:pop.sina.com或pop3.sina.com,
发送服务器地址为:smtp.sina.com

- 新浪@sina.cn邮箱,
接收服务器地址为:pop.sina.cn或pop3.sina.cn,
发送服务器地址为:smtp.sina.cn

- 端口号设置:
POP协议:pop端口:110、smtp端口:25 
IMAP协议:IMAP 端口:143、smtp端口:25

- 加密设置:
pop是995、imap的是993
smtp是587或465,如465不能正常使用,
可以更换587试试,但不同的国家有可能只支持
一个端口(并非所有客户端都支持加密码) 。
  • Outlook邮箱:
- POP
Server name: outlook.office365.com
Port: 995
Encryption method: TLS

- IMAP
Server name: outlook.office365.com
Port: 993
Encryption method: TLS

- SMTP
Server name: smtp.office365.com
Port: 587
Encryption method: STARTTLS

@solomonxie
Copy link
Owner Author

solomonxie commented Feb 8, 2019

❖ 正式的介绍「Mutt」:命令行的邮件大师 (一文详解)

为什么要用Mutt?
这个世界已经有了成百上千的漂亮邮件客户端,为什么还要用命令行里的?
其实说什么功能都没用。说到本质上,其实是一种Geek精神,一种爱折腾的精神,一种Customizability的精神。就像明明有WhatsApp,还要用IRC一样的精神;明明有Finder,还要用Ranger的精神。
在终端里待久了,会比较烦GUI,所以不管什么软件都会寻求终端的替代方案。
对于这个需求来说,在Linux的世界里,似乎就只有一个选择:Mutt。

Mutt的可配置性,强如Vim。配置起来也和Vim差不多,有专门的~/.muttrc供你配置软件本身。

需要理解的是:Mutt本身是一个框架而已。收件、发件、编辑邮件等功能,是要通过搭配不同的程序来做到的。

Mutt的模块搭配方案

就像穿衣搭配一样,收件发件过滤邮件转发邮件各种功能都有很多种程序可以用,mutt怎么搭配呢?
常用选项有这些(User/Transport/Delivery):

  • MUA 收件:fetchmailgetmailOfflineIMAP
  • MTA 发件:sendmailmsmtppostfix。其中msmtp兼容强,postfix对国内不友好
  • MDA 分类: procmailmaildrop
  • 邮件编辑:VIM。

参考邮件代理(功能分类):Email agent (infrastructure) - Wikipedia

一般搭配是:

  • 老式搭配:mutt + getmail + sendmail + procmail
  • 新式搭配:mutt + fetchmail + msmtp + maildrop

但是maildrop不支持Mac,而procmail比较通用一点。所以这里我们用:
mutt + fetchmail + msmtp + procmail

安装:

# Mac
$ brew install mutt fetchmail msmtp procmail

# Ubuntu
$ sudo apt-get install mutt fetchmail msmtp procmail -y

Mutt或各个写协作程序在配置前都是不能使用的,学习曲线还是比较陡峭的,所以要做好准备去花好一段去了解和学习各个部件。

大概的配置流程是:

  • 配置收件:~/.fetchmailrc
  • 配置过滤:~/.procmailrc
  • 配置发件:~/.msmtprc
  • 配置mutt框架本身:~/.muttrc

注意:初学过程中,不要一上来就配置mutt。最好是先从各个部件开始:收件->过滤邮件->阅读邮件->发件->mutt界面,按照这种顺序。

配置参考:
参考Arch Wiki:Mutt (极详细,但对人类不友好)
参考Youtube:Mutt - Email for everyone (nerds like me)

收件:配置Fetchmail

Fetchmail是由著名的《大教堂与集市》作者 Eric Steven Raymond 编写的。

Fetchmail是一个非常简单的收件程序,而且是前台运行一次性运行的,意思是:你每次手动执行fetchmail命令,都是在前台一次收取完,程序就自动退出了,不是像一般邮件客户端一直在后台运行。

注意:fetchmail只负责收件,而不负责存储!所以它是要调用另一个程序如procmail来进行存储的。

fetchmail的配置文件为~/.fetchmailrc。然后文件权限最少要设置chmod 600 ~/.fetchmailrc

参考:Using Fetchmail to Retrieve Email

比如我们要设置多个邮箱账户同时收取,那么配置如下:

poll pop.AAA.com protocol POP3 user "me@AAA.com" password "123"
poll pop.BBB.com protocol POP3 user "me" there with password "123" is falko here fetchall
poll pop.CCC.com protocol POP3 user "me" there with password "123" is till here keep
poll pop.DDD.com
  protocol POP3
  user "me"
  password "123"

# 全局选项
mimedecode
mda "/usr/local/bin/procmail"

其中,

  • 各种参数可以不按顺序,也可以不在一行。 空格隔开每个参数,poll隔开每个账户。
  • here, there, with, is等等,都不是关键词,随便写不影响参数。
  • poll后面是邮件服务器的地址,一般是pop.xxx.com
  • protocol后面是收件协议,一般是poppop3
  • user后面是用户名,可以是username,也可以是邮箱地址
  • password后面是密码
  • 以上是必填,其它都不是必要的
  • 四选一:fetchall, nofetchall, keep, nokeep
  • mimedecode用来自动解码MIME
  • mda后面指定本机安装的邮件过滤分类程序。如果不填,则收取的邮件在本地不会保存。可以用$ which procmail查一下路径。

配置完成后,可以运行fetcmail -v来看看是否有错误信息,如果能够正常显示很多行的收取信息,那么就能正确登录邮箱收取了。

一般收取的命令如下:

# 只收取未读邮件
$ fetchmai

# 收取所有邮件
$ fetchmail -a

# (重要)收取新邮件,但不在服务器端删除已经收取的邮件
$ fetchmail -k

但是fetchmail只负责收取,不负责“下载”部分,你找不到邮件存在哪了。
所以还需要配置MDA分类器,如procmail,才能看到下载后的邮件。

注意:Fetch其实不是在Mutt“里”使用的,而是脱离mutt之外的!也就是说,Mutt只负责读取本地存储邮件的文件夹更新,而不会自动帮你去执行fetchmail命令。

你必须自己手动执行,或者用Crontab定期收取,或者设为Daemon守护进程,还可以在Mutt中设置快捷键执行Shell命令。

设置Mutt快捷键收取邮件的方法是在~/.muttrc中加入macro:

macro index,pager I '<shell-escape> fetchmail -vk<enter>'

这样的话,你就可以在index邮件列表中按I执行外部shell命令收取邮件了。

邮件过滤:配置Procmail

Procmail是单纯负责邮件的存储、过滤和分类的,一般配合fetchmail收件使用。

在Pipline中,fetchmail把收到的邮件全部传送到Procmail进行过滤筛选处理,然后Procmail就会把邮件存到本地形成文件,然后给邮件分类为工作、生活、重要、垃圾等。

当然,分类规则是自己可以指定的。可以根据发信人、主题、长度以及关键字 等对邮件进行排序、分类、整理。

参考:Procmail

Procmail 的配置文件是 ~/.procmailrc ,记得改权限:chmod 600 ~/.procmailrc
内容也非常简单,前面是邮件位置、日志等默认选项,后面则是一块一块的过滤规则。

基本配置:

MAILDIR=$HOME/Mail   #邮件存储地址
DEFAULT=$MAILDIR/inbox   #默认:收件箱
VERBOSE=off
LOGFILE=/tmp/procmaillog

# 某个垃圾邮件规则
:0
* ^From: webmaster@st\.zju\.edu\.cn
/dev/null    #垃圾文件的存储位置

# 其它所有都存到收件箱中
:0:
inbox/

其中,$HOME/Mail是设定的邮件存储位置。
我们需要手动创建mkdir ~/Mail,否则程序会报错。

配置好后,我们再测试一下,假设邮箱里有一封未读邮件,就会看到:

$ fetchmail
1 message for Jason@aliyun.com at pop3.aliyun.com (7833 octets).
reading message Jason@aliyun.com@pop3.aliyun.com:1 of 1 (7833 octets) flushed

$ tree ~/Mail
/Users/Jason/Mail
└── inbox
    ├── cur
    ├── new
    │   └── 1549706227.89809_0.Jason-mba.lan
    └── tmp

可以看到,一封新邮件保存到了~/Mail/inbox/new/中,文件为1549706227.89809_0.Jason-mba.lan。但是手动打开以后是这样的:

image

这个实际上就是邮件的真面目:MIME格式(协议)的邮件源码。就像HTML一样,展示给我们的和背后的源码不一样。

那么怎么把这个类似HTML的MIME格式邮件解析为我们人能读懂的内容呢?
这个我们就要靠mutt自己了,mutt自身具备基本的MIME邮件解析功能(不包括HTML格式邮件读取)。

但是这里我们先不讲邮件阅读的问题,把它留在最后。

发件:配置msmtp

msmtp是作为替代sendmail发邮件程序的更好替代品。
msmtp的配置文件为~/.msmtprc,记得改权限:chmod 600 ~/.msmtprc
配置内容比收件还简单,因为发件永远比收件简单。

Tip: 发件的服务器是smtp协议。收件才是pop3协议。

基本配置:

account default
  auth login
  host smtp.XXX.com
  port 587
  from ME@XXX.com
  user ME
  password passwd
  tls on
  tls_certcheck off

logfile /tmp/msmtp.log

其中注意,关于tls,如果是阿里云则不用写,如果是Outlook的话,必须写:

    tls on
    tls_starttls on
    tls_certcheck off

主界面:配置Mutt

Mutt的配置文件为~/.muttrc,记得改权限:chmod 600 ~/.muttrc

另外:mutt的配置文件还可以放在~/.mutt/muttrc。这种方法有一个好处,即~/.mutt/目录下可以放很多主题、插件等文件。

基本配置:

# 通用设定
set use_from=yes
set envelope_from=yes
set move=yes    #移动已读邮件
set include #回复的时候调用原文
set charset="utf-8"
auto_view text/html   #自动显示HTML

# 发送者账号
set realname="Solomon Xie"
set from="solomonxie@aliyun.com"

# 分类邮箱
set mbox_type = Maildir #Mail box type
set folder = "$HOME/Mail"
set spoolfile = "$HOME/Mail/inbox" #INBOX
set mbox="$HOME/Mail/seen"  #Seen box
set record="$HOME/Mail/sent"  #Sent box
set postponed="$HOME/Mail/draft"  #Draft box

# 关联程序(需要自己用which命令确定一下)
set editor="vim -nw"
set sendmail="/usr/local/bin/msmtp"

极简配置

综合上面的四大配置文件,下面是我的四个文件的极简配置:

image

另外可参考网友的极简配置:https://gist.github.com/iharsuvorau/45a078ecb597eb916fdf

现在我的目的是先让收发件运行起来,至于界面美化、快捷键设定等,我们以后再说,里面很有学问。

确认邮箱服务器有没有问题

即使上面配置一切OK,也不一定能正常收发邮件。因为你用的Gmail、QQ、网易、阿里云等等,后台都有一系列的第三方收取设置。这是各不相同的。

比如QQ和网易,现在几乎已经不能用了(2019),为什么?因为它们完全阻止了第三方客户端收发件。即使你去后台设置面板,可以通过手机短信验证之类设置,但是会发现实际上总是验证不了总是通过不了。所以本质上,他们只允许自己的官方客户端不允许任何别的手机、PC客户端(流氓行径)

Gmail在国内用不了众所周知。现在比较好用的只有阿里云和微软的Outlook了。

除了第三方客户端的允许,我们还要设置POP。最好放开全部邮件或者最近30天,然后禁止客户端删信。这是什么意思呢?POP默认客户端在收件后,服务器上的邮件就自动删除了!这个不太合适,所以必须要禁止

例如阿里云邮箱:

image

Mutt主界面的基本操作

参考:How to Use the Fast and Powerful Mutt Email Client with Gmail
参考Youtube:mutt - Terminal Email Client - Linux TUI

邮件列表操作:

  • 基本:q:Quit, d:删除当前邮件, s:将邮件移动至指定文件夹, m:创建新邮件, r:回复当前邮件, ?:帮助
  • 移动:j/k 上下移动邮件, z/Z上下翻页, <Number> 跳至序号处(不进入邮件)
  • <Enter> 打开选中的邮件
  • /在当前文件夹搜索
  • d 将选中邮件标记为删除, N 将选中邮件标记为未读, $ 让标记的东西生效,如删除、未读等。
  • f 转发选中邮件, e 编辑选中邮件
  • c切换文件夹(inbox/seen/draft等), 需要输入文件夹名称,或按?在列表里选择,j/k上下移动。
  • gi查看Inbox,ga查看所有邮件,gd查看Draft,gs查看星标邮件

在邮件中的操作:

  • j/k 上一封/下一封邮件, <Space>: 向下翻页, <Enter>: 向下滚动
  • e 编辑当前邮件, t编辑TO,c编辑CC,b编辑BCC,y发送邮件,a添加附件,Return查看附件,E编辑附件,D删除附件

使用命令操作

Mutt如同Vim一样,不光可以把命令绑定为快捷键,还能直接输入:直接输入命令。
但是稍有不同的是,Mutt称之为Action,而且需要用:exec <命令>这样格式执行。

比如sidebar侧边栏的移动,命令是:sidebar-next, sidebar-prev
那么我们可以直接输入:exec sidebar-next,按下回车执行。

参考:https://gitlab.com/muttmua/mutt/wikis/MuttFaq/Action

Mutt乱码问题

一般分为:

  • 邮件列表乱码
  • 内容乱码
  • 附件乱码

无论~/.muttrc中怎么设置charset=utf-8都没用。

这个时候,先在mutt中输入命令查看软件当前的charset设置::set &charset ?charset
如果显示的是charset="us-ascii",那么就没错,ascii绝对不会显示中文。必须要utf-8等其它unicode格式才行。

但是为什么muttrc中设置charset没用呢?

测试了下,在MacOS、Ubuntu中同时设置一样的配置,Ubuntu正常显示中文,MacOS却不能。
在Ubuntu中输入测试的命令,显示出charset="utf-8";而MacOS里无论iTerm2或Terminal,都是显示us-ascii,且乱码。

问题就变成了:为什么muttrc中的charset不生效?

locale大法:
在命令行里分别输入$ locale命令,查看Shell中的语言设置,发现,我在Mac中的Locale是:

↳ $ locale
LANG=
LC_COLLATE="C"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL=

而Ubuntu中的确是:

↳ $ locale
LANG=en_GB.UTF-8
LANGUAGE=
LC_CTYPE=en_GB.UTF-8
LC_NUMERIC="en_GB.UTF-8"
LC_TIME="en_GB.UTF-8"
LC_COLLATE="en_GB.UTF-8"
LC_MONETARY="en_GB.UTF-8"
LC_MESSAGES="en_GB.UTF-8"
LC_PAPER="en_GB.UTF-8"
LC_NAME="en_GB.UTF-8"
LC_ADDRESS="en_GB.UTF-8"
LC_TELEPHONE="en_GB.UTF-8"
LC_MEASUREMENT="en_GB.UTF-8"
LC_IDENTIFICATION="en_GB.UTF-8"
LC_ALL=

也许问题就出在这里:Shell的设置出了问题,而不是mutt的设置!

解决方法很简单:

$ export LANG=en_US.UTF-8

然后再输入locale命令就可以看到正常的语言编码设置了。
再打开mutt也是正常显示。

但是直接这样export是临时的,需要把这个加入到~/.zshrc~/.bash_profile中。

HTML网页格式邮件的浏览

参考:https://debian-administration.org/article/75/Reading_HTML_email_with_Mutt
参考:https://fiasko.io/projects/htmail-view.html.en
参考:http://jasonwryan.com/blog/2012/05/12/mutt/

大概两步:

  • 创建~/.mailcap文件,在里面设定HTML渲染规则
  • ~/.muttrc中设定auto_view等自动浏览规则

普通的邮件,内容只是单纯的text/plain格式,这样我们不用渲染直接看就行。但有的邮件为了美化,往往用text/html的格式展现,这就很麻烦,因为看到的都是html代码。
所以遇到HTML格式的邮件,我们需要做的是利用第三方软件来Render(渲染).

渲染的问题涉及到两个问题需要解决:

  • HTML源码转换成人类可读的text文字
  • 显示图片

HTML源码翻译成文字非常好解决,只要利用w3m等命令行浏览器即可完成,非常轻量非常简单非常快感受不到有它的存在,可以直接在mutt中查看。
但是图片就有些问题了:图片在终端里展示,一直是个问题。虽然可以达到,但是需要配置很多东西。所以有人为了图方便,遇到HTML格式邮件,就直接弹出chrome网页来看(不推荐)。这样说实话,就没什么意义了。

常用的HTML渲染为Text的方式有:

  • w3m: 命令行里的浏览器
  • links

常用的图片显示方法有:

  • 直接弹出chrome浏览器查看内容 (BAD!)

w3m渲染

brew install w3m后,就得到了一个命令行里的浏览器。

然后我们需要配置两个mutt配置文件。

~/.muttrc添加这两行:

auto_view text/html # View HTML automatically
alternative_order text/plain text/enriched text/html # save html for last

~/.mailcap添加这一行:

text/html; w3m -I %{charset} -T text/html; copiousoutput;

然后重新打开mutt,再打开一个html格式的邮件就发现,内容已经很好的转换成人可读的text格式了。
当然,这时候还不能看图片。

关于mutt图片渲染的问题,我们留到另一篇专门说明。

@solomonxie
Copy link
Owner Author

solomonxie commented Feb 10, 2019

Mac上用Homebrew管理服务(守护进程) [DRAFT]

Mac上的后台服务或守护进程和Linux上有很大不同,为了减少学习曲线,我们可以直接Homebrew帮忙轻松设置服务。

brew services一开始没有,但是第一次使用这个命令的时候,Homebrew就会自动下载安装。

常用命令:

  • brew services list 显示Homebrew管理的所有服务
  • brew services start 程序名 安装并启动某程序的服务
  • brew services run 程序名 只是启动某程序的服务,但不会自动启动
  • brew services stop 程序名 停止服务,也停止了自动启动
  • brew services restart 程序名 重启服务

理解brew services

MacOS管理开机启动的服务,是采用系统内置的launchctl命令,Homebrew只是调用了这个程序,帮我们自动安装服务而已。但这也省去了不少自己配置服务的麻烦。

我们可以输入launchctl list命令,查看当前MacOS中已经安装的服务列表。
如果Homebrew已经帮我们安装了一些服务,那么运行这个列表,就会看到类似这种名称的服务:

image

参考:使用 brew services 管理后台服务(MacOS)
参考:brew services 原理解析,如何查看 brew services 列表?

MacOS设置服务的方法,实际上是在~/Library/LaunchAgents/这个目录下放置一个一个的*.plist文件,每个plist,都是一个服务。而服务的具体配置如启动位置、启动顺序等,都是在这个XML格式的plist文件中配置。

如果不想了解手动的配置方法,就直接使用brew services即可。当然,前提是程序是用homebrew安装的,且程序支持brew services配置。如果不支持,那么只能自己手动做了。

手动的方法就是用launchctl程序指定plist文件位置控制,如launchctl load 文件位置来启动服务,用launchctl unload 文件位置来停止服务。

参考:使用 Homebrew 管理 Mac 的后台服务.md

安装常用的程序

常用程序有:

  • MySQL
  • Redis

@solomonxie
Copy link
Owner Author

solomonxie commented Feb 11, 2019

Mutt美化指南 [DRAFT]

Mutt配置主题

Mutt主题配置非常简单:下载主题文件,然后在~/.muttrcsource /path/to/file引用这个主题,完成!

例如,我们用著名的Gruvbox主题:https://github.com/altercation/mutt-colors-solarized

下载各种文件后,挑一个dark或light主题,比如mutt-colors-solarized-dark-256.muttrc,然后,比如我们放到~/目录下。然后编辑~/.muttrc,在里面加一句:

source ~/.mutt/mutt-colors-solarized-dark-256.muttrc

重新打开mutt即可看到效果。

image

Sidebar 侧边栏设置

侧边栏可以在~/.muttrc中一句set sidebar_visible = yes就开启侧边栏。
但是,默认侧边栏是空的!必须要我们手动在muttrc中添加才行。

比如:

# Account Settings
mailboxes Personal \
          +jeff@jeffjewiss.com/INBOX \
          +jeff@jeffjewiss.com/archive \
          +jeff@jeffjewiss.com/github \
          +jeff@jeffjewiss.com/newsletters \
          +jeff@jeffjewiss.com/sent \
          +jeff@jeffjewiss.com/drafts \
          Gmail \
          +jeffjewiss@gmail.com/INBOX \
          +jeffjewiss@gmail.com/archive \
          +jeffjewiss@gmail.com/sent \
          +jeffjewiss@gmail.com/drafts \
          Work \
          +jeff@tallarium.com/INBOX \
          +jeff@tallarium.com/archive \
          +jeff@tallarium.com/sent \
          +jeff@tallarium.com/drafts \

然后就会显示出类似这种效果:

image

侧边栏的操作:

这个没有默认的快捷键,需要自己手动设置才能有。

示例:

    bind index,pager <up> sidebar-prev
    bind index,pager <down> sidebar-next
    bind index,pager <right> sidebar-open

    # Use 'B' to switch the Sidebar on and off
    bind index,pager B sidebar-toggle-visible

这样设置的话,Up/Down用来上下选择侧边栏的文件夹,Right键进入选中的文件夹。B用来开关侧边栏。

邮件列表美化

列表的排序,默认是从旧到新,但是一般我们习惯从新到旧。所以我们在muttrc中设置如下:

    set sort=threads
    set sort_browser=date
    set sort_aux=reverse-last-date-received

效果如下:

image

@solomonxie
Copy link
Owner Author

solomonxie commented Feb 16, 2019

❖ 终端录屏程序asciinema

对于经常要写开发教程和攻略来说,GIF动图能增强不少说明力。问题是,录制视频再转GIF太麻烦,直接用一些GIF录屏也躲不过图片体积太大:动辄好几MB这一关。
所以这时候我们就要让流行的asciinema命令上场了。它能轻松录制你在终端里的所有操作,把所有动作保存为JSON文档,而不是真的录制视频,所以文件都极其小。要播放的话可以直接用它的命令播放。要转换GIF的话有相关的转换器,转换后体积都不会比直接录制屏幕大。

rec

Mac安装:

$ brew install asciinema

Pip安装:

$ pip install asciinema

录屏:

$ asciinema rec <output-file-name>

其中可以指定输出文件的名字,扩展名可以是*.json,*.cast都行,随意。
本质上文件是一个JSON格式的数据集,记录了每个步骤细节。如果不指定文件名也可以,程序会自动生成一个文件,并显示输出的文件路径。
所以,程序制成的格式是不能用视频播放器或GIF播放器播放的,只能用asciinema程序播放。

播放:

$ asciinema play </path/to/file>

Ctrl-c退出播放。

附加/覆盖:

# 在已经录制的文件后附加录制内容:
$ asciinema rec <output-file-name> --append

# 覆盖已经录制的文件
$ asciinema rec <output-file-name> --overwrite

对Tmux录屏

对一个Tmux录屏,需要先退出tmux,然后通过asciinema进入tmux的指定session进行录制。
如下:

$ asciinema rec --command "tmux attach -t session-name"

录制结束后,不要直接Ctrl-D退出,而是先prefix-d退出Tmux,再Ctrl-c结束录制。

asciinema转换为GIF图片

有时候我们需要把录屏结果显示到网页上,那么就需要转换为GIF图片了。
asciinema程序自身没有转换功能,但是官方开发了一个NodeJS版本的程序用来转换:
参考:asciinema/asciicast2gif

前提是本机已经安装:NodeJSImageMagickgiflossy (或gifsicle)。

Mac安装过程:

brew install ImageMagick gifsicle node
npm install --global asciicast2gif

转换:

$ asciicast2gif </path/to/INPUT.json> </path/to/OUTPUT.gif>

如:

image

转换过程很慢,但是文件非常小,远比自己直接录屏要小很多。
比如下面的GIF,直接视频录屏转GIF的文件是7M左右,通过减少帧率和显示效果文件在1M左右,而用asciinema转换为GIF超清晰原画,只有237Kb。可见一斑。

rec

rec

有时候如果文件比较大,可以选择在转换前选择降低显示效果。
asciicast2gif降低效果的方法是设置Environment Variable环境变量GIFSICLE_OPTS。比如:

$ export GIFSICLE_OPTS="-k 16 -O3"
$ asciicast2gif </path/to/INPUT.json> </path/to/OUTPUT.gif>

# or
GIFSICLE_OPTS="-k 16 -O3" asciicast2gif </path/to/INPUT.json> </path/to/OUTPUT.gif>

@solomonxie
Copy link
Owner Author

Apt-get 的upgradedist-upgrade区别

upgrade只是单纯的将各个软件的版本升级到最新,不关心各个软件编译时候的依赖是否更新
dist-upgrade则不光让各个软件自身更新,还会检查其依赖,让软件的依赖包也更新到最新版本。

很多时候如果upgrade不管用,我们就可以用dist-upgrade来试试。

@solomonxie
Copy link
Owner Author

Linux创建相对软链接

Refer to: https://unix.stackexchange.com/questions/10370/make-a-symbolic-link-to-a-relative-pathname/10371

如果用比较新的linux版本,就可以使用relative symbolic link相对软链接了。
用这个命令可以看到是否支持:

$ ln --help | grep relative

创建软链接方式:

$ ln -rs /tmp/test/to /tmp/test/from

@solomonxie
Copy link
Owner Author

solomonxie commented Feb 27, 2020

Tmux 为每个Pane设置个Title (好看) [DRAFT]

#tmux.conf

set -g pane-border-status top

# set -g pane-border-format " #P: #T #{pane_current_command} #{pane_name}"
set -g pane-border-format " [#P] #T "

默认的这个 #T 是Hostname。
为了方便换title,与其设各种function,我们最简单的就是设置一个alias:

$ alias panetitle="printf '\033]2;%s\033\\'"

$ panetitle 'this is my new title'

@solomonxie
Copy link
Owner Author

How to pass multiple Environment variables in One String to the command

Refer to: https://stackoverflow.com/questions/59596537/how-to-pass-environment-variables-from-a-string-to-a-bash-command

Support we have a script to read environment variables:

# demo.sh
echo Name is: $NAME
echo Age is: $AGE
$ envvars=( NAME=Jason AGE=18 )
$ env "${envvars[@]}" ./demo.sh
Name is: Jason
Age is: 18

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
HF High frequency notes Linux
Projects
None yet
Development

No branches or pull requests

1 participant