Skip to content

Latest commit

 

History

History
489 lines (369 loc) · 15.8 KB

shell.md

File metadata and controls

489 lines (369 loc) · 15.8 KB

🐌 Shell相关脚本

❗️ master是 不再开发的老版本1.x的分支 ❗️

请切到 新版本的开发分支


Shell使用加强

🍺 c

原样命令行输出,并拷贝标准输出到系统剪贴板,省去CTRL+C操作,优化命令行与其它应用之间的操作流。
支持LinuxMacWindowscygwinMSSYS)。

命令名c意思是Copy,因为这个命令我平时非常常用,所以使用一个字符的命令名,方便键入。

更多说明参见拷贝复制命令行输出放在系统剪贴板上

用法/示例

有3种使用风格,根据需要或是你的偏好选取。

############################################################
# 1. 前缀方式,后面跟上要运行的命令
############################################################
$ c pwd
/Users/jerry
$ c echo -e 'a\nb'
a
b
# 这种使用方式,后面跟的命令不能是别名(alias),对于别名可以用下面的使用方式。

############################################################
# 2. 后缀方式,管道
############################################################
$ echo -e 'a\nb' | nl | c
1   a
2   b
# gb是oh-my-zsh的别名,列出git的分支,需要后缀的方式的使用。
$ gb | c

############################################################
# 3. 从标准输入读取内容。拷贝文件内容时这种方式最直接。
############################################################
$ c < ~/.ssh/id_rsa.pub
ssh-rsa EAAAABIwAAAQEAz+ETZEgoLeIiC0rjWewdDs0sbo8c...== [email protected]

############################################################
# -q选项:拷贝但不输出。
# 当输出内容比较多、又不关心输出内容和命令执行进展时,可以使用这个选项。
############################################################
$ c -q < ~/.ssh/id_rsa.pub

# 帮助信息
$ c --help
Usage: c [OPTION]... [command [command_args ...]]
Run command and put output to system clipper.
If no command is specified, read from stdin(pipe).

Example:
  c echo "hello world!"
  c grep -i 'hello world' menu.h main.c
  set | c
  c -q < ~/.ssh/id_rsa.pub

Options:
  -k, --keep-eol  do not trim new line at end of file
  -q, --quiet     suppress all normal output, default is false
  -h, --help      display this help and exit

参考资料

🍺 coat

彩色cat出文件行,方便人眼区分不同的行。
支持LinuxMacWindowscygwinMSSYS)。

命令支持选项、功能和使用方式与cat命令完全一样(实际上读流操作在实现上全部代理给cat命令)。

命令名coat意思是COlorful cAT;当然单词coat的意思是外套,彩色输入行就像件漂亮的外套~ 😆
注:之前命名是colines(意思是COLorful LINES)。

示例

$ echo Hello world | coat
Hello world
$ echo -e 'Hello\nWorld' | coat
Hello
World
$ echo -e 'Hello\nWorld' | nl | coat
     1	Hello
     2	World
$ coat file1 file2.txt
line1 of file1
line2 of file1
...
line1 of file2
line2 of file2
...

# 帮助信息
#   可以看到本人机器上实现代理的`cat`命令是GNU的实现。
$ coat --help
Usage: cat [OPTION]... [FILE]...
Concatenate FILE(s) to standard output.

With no FILE, or when FILE is -, read standard input.

  -A, --show-all           equivalent to -vET
  -b, --number-nonblank    number nonempty output lines, overrides -n
  -e                       equivalent to -vE
  -E, --show-ends          display $ at end of each line
  -n, --number             number all output lines
  -s, --squeeze-blank      suppress repeated empty output lines
  -t                       equivalent to -vT
  -T, --show-tabs          display TAB characters as ^I
  -u                       (ignored)
  -v, --show-nonprinting   use ^ and M- notation, except for LFD and TAB
      --help     display this help and exit
      --version  output version information and exit

Examples:
  cat f - g  Output f's contents, then standard input, then g's contents.
  cat        Copy standard input to standard output.

GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
Full documentation at: <http://www.gnu.org/software/coreutils/cat>
or available locally via: info '(coreutils) cat invocation'

注:上面示例中,没有彩色;在控制台上运行可以看出彩色效果,如下:
coat screenshot

🍺 a2l

按行彩色输出参数,方便人眼查看。
支持LinuxMacWindowscygwinMSSYS)。

命令名a2l意思是Arguments to(2) Lines

示例

$ a2l *.java
A.java
B.java
...

# zsh支持 **/* 跨目录glob,可以方便搜索,但是输出内容是空格分隔的不方便查看。
# 把参数按行输出方便查看 或是 grep
$ a2l **/*.sh
console-text-color-themes.sh
swtrunk.sh
test-cases/parseOpts-test.sh
test-cases/self-installer.sh
...

注:上面示例中,没有彩色;在控制台上运行可以看出彩色效果,和上面的coat命令一样。

🍺 ap and rp

批量转换文件路径为绝对路径/相对路径,会自动跟踪链接并规范化路径。
支持LinuxMacWindowscygwinMSSYS)。

命令名ap意思是Absolute PathrpRelative Path

示例

# ap缺省打印当前路径的绝对路径
$ ap
/home/admin/useful-scripts/test
$ ap ..
/home/admin/useful-scripts
# 支持多个参数
$ ap .. ../.. /etc /etc/../etc
/home/admin/useful-scripts
/home/admin
/etc
/etc

# rp当一个参数时,打印相对于当前路径的相对路径
$ rp /home
../..
# 多于一个参数时,打印相对于最后一个参数的相对路径
$ rp /home /etc/../etc /home/admin
..
../../etc

统计各个TCP连接状态的个数。
支持LinuxMacWindowscygwinMSSYS)。

NginxApache的机器上需要查看,TCP连接的个数,以判定

  • 连接数、负荷
  • 是否有攻击,查看SYN_RECV数(SYN攻击)
  • TIME_WAIT数,太多会导致TCP: time wait bucket table overflow

用法

tcp-connection-state-counter

示例

$ tcp-connection-state-counter
ESTABLISHED  290
TIME_WAIT    212
SYN_SENT     17

贡献者

sunuslee改进此脚本,增加对MacOS的支持。 #56

🍺 xpl and xpf

在命令行中快速完成 在文件浏览器中 打开/选中 指定的文件或文件夹的操作,优化命令行与其它应用之间的操作流。
支持LinuxMacWindowscygwinMSSYS)。

  • xpl:在文件浏览器中打开指定的文件或文件夹。
    xplexplorer的缩写。
  • xpf: 在文件浏览器中打开指定的文件或文件夹,并选中。
    xpfexplorer and select file的缩写。

用法

xpl
# 缺省打开当前目录
xpl <文件或是目录>...
# 打开多个文件或目录

xpf
# 缺省打开当前目录
xpf <文件或是目录>...
# 打开多个文件或目录

示例

xpl /path/to/dir
xpl /path/to/foo.txt
xpl /path/to/dir1 /path/to/foo1.txt
xpf /path/to/foo1.txt
xpf /path/to/dir1 /path/to/foo1.txt

贡献者

Linhua Tan修复Linux的选定Bug。

Shell开发/测试加强

在编写脚本时,常常要确认输入参数是否是期望的:参数个数,参数值(可能包含有人眼不容易发现的空格问题)。
支持LinuxMacWindowscygwinMSSYS)。

这个脚本输出脚本收到的参数。在控制台运行时,把参数值括起的括号显示成 红色,方便人眼查看。

示例

$ ./echo-args 1 "  2 foo  " "3        3"
0/3: [./echo-args]
1/3: [1]
2/3: [  2 foo  ]
3/3: [3        3]

使用方式

需要查看某个脚本(实际上也可以是其它的可执行程序)输出参数时,可以这么做:

  • 把要查看脚本重命名。
  • 建一个echo-args脚本的符号链接到要查看参数的脚本的位置,名字和查看脚本一样。

这样可以不改其它的程序,查看到输入参数的信息。

显示Terminator的全部文字彩色组合的效果及其打印方式。
支持LinuxMacWindowscygwinMSSYS)。

脚本中,也给出了colorEchocolorEchoWithoutNewLine函数更方便输出彩色文本

用法

colorEcho <颜色样式> <要输出的文本>...
colorEchoWithoutNewLine  <颜色样式> <要输出的文本>...

示例

source console-text-color-themes.sh

# 输出红色文本
colorEcho "0;31;40" "Hello world!"
# 输出黄色带下划线的文本
colorEchoWithoutNewLine "4;33;40" "Hello world!" "Hello Hell!"

运行效果

console-text-color-themes.sh的运行效果图

贡献者

姜太公提供循环输出彩色组合的脚本。

参考资料

命令行选项解析库,加强支持选项有多个值(即数组)。
支持LinuxMacWindowscygwinMSSYS)。

自己写一个命令行选项解析函数,是因为bashbuildin命令getopts和加强版本命令getopt都不支持数组的值。

指定选项的多个值(即数组)的风格模仿find命令的-exec选项:

$ find . -name \*.txt -exec echo "find file: " {} \;
find file: foo.txt
find file: bar.txt
...

用法

parseOpts函数的第一个参数是要解析的选项说明,后面跟实际要解析的输入参数。

选项说明可以长选项和短选项,用逗号分隔,如a,a-long。不同选项的说明间用竖号分隔,如a,a-long|b,b-long:

选项说明最后可以有选项类型说明:

  • -: 无参数的选项。即有选项则把值设置成true。这是 缺省 的类型。
  • :: 有参数的选项,值只有一个。
  • +: 有多个参数值的选项。值列表要以;表示结束。
    注意,;Bash的元字符(用于一行中多个命令分隔),所以加上转义写成\;(当然也可以按你的喜好写成";"';')。

实际要解析的输入参数往往是你的脚本参数,这样parseOpts函数调用一般是:

parseOpts "a,a-long|b,b-long:|c,c-long+" "$@"
# "$@" 即是回放你的脚本参数

通过约定的全局变量来获取选项和参数:

  • 选项名为a,通过全局变量_OPT_VALUE_a来获取选项的值。
  • 选项名为a-long,通过全局变量_OPT_VALUE_a_long来获取选项的值。
    即,把选项名的-_,再加上前缀_OPT_VALUE_对应的全局变量来获得选项值。
  • 除了选项剩下的参数,通过全局变量_OPT_ARGS来获取。

按照惯例,输入参数中如果有--表示之后参数中不再有选项,即之后都是参数。

示例

# 导入parseOpts.sh
source /path/to/parseOpts.sh

parseOpts "a,a-long|b,b-long:|c,c-long+" -a -b bv --c-long c.sh -p pv -q qv arg1 \; aa bb cc
# 可以通过下面全局变量来获得解析的参数值:
#    _OPT_VALUE_a = true
#    _OPT_VALUE_a_long = true
#    _OPT_VALUE_b = bv
#    _OPT_VALUE_b_long = bv
#    _OPT_VALUE_c = (c.sh -p pv -q qv arg1) ,数组类型
#    _OPT_VALUE_c_long = (c.sh -p pv -q qv arg1) ,数组类型
#    _OPT_ARGS = (aa bb cc) ,数组类型

--的使用效果示例:

# 导入parseOpts.sh
source /path/to/parseOpts.sh

parseOpts "a,a-long|b,b-long:|c,c-long+" -a -b bv -- --c-long c.sh -p pv -q qv arg1 \; aa bb cc
# 可以通过下面全局变量来获得解析的参数值:
#    _OPT_VALUE_a = true
#    _OPT_VALUE_a_long = true
#    _OPT_VALUE_b = bv
#    _OPT_VALUE_b_long = bv
#    _OPT_VALUE_c 没有设置过
#    _OPT_VALUE_c_long 没有设置过
#    _OPT_ARGS = (--c-long c.sh -p pv -q qv arg1 ';' aa bb cc) ,数组类型

兼容性

这个脚本比较复杂,测试过的环境有:

  1. bash --version
    GNU bash, version 4.1.5(1)-release (x86_64-pc-linux-gnu)
    uname -a
    Linux foo-host 2.6.32-41-generic #94-Ubuntu SMP Fri Jul 6 18:00:34 UTC 2012 x86_64 GNU/Linux
  2. bash --version
    GNU bash, version 3.2.53(1)-release (x86_64-apple-darwin14)
    uname -a
    Darwin foo-host 14.0.0 Darwin Kernel Version 14.0.0: Fri Sep 19 00:26:44 PDT 2014; root:xnu-2782.1.97~2/RELEASE_X86_64 x86_64 i386 MacBookPro10,1 Darwin
  3. bash --version
    GNU bash, version 3.00.15(1)-release (i386-redhat-linux-gnu)
    uname -a
    Linux foo-host 2.6.9-103.ELxenU #1 SMP Wed Mar 14 16:31:15 CST 2012 i686 i686 i386 GNU/Linux

贡献者

Khotyn Huang指出bash 3.0下使用有问题,并提供bash 3.0的测试机器。