Coder Social home page Coder Social logo

oldratlee / useful-scripts Goto Github PK

View Code? Open in Web Editor NEW
7.2K 7.2K 2.8K 1.76 MB

🐌 useful scripts for making developer's everyday life easier and happier, involved java, shell etc.

Home Page: https://github.com/oldratlee/useful-scripts

License: Apache License 2.0

Shell 88.16% Python 11.84%
bash developers-everyday-life java option-parser python script shell show-busy-java-threads show-duplicate-java-classes terminal useful-scripts

useful-scripts's Introduction

🐌 useful-scripts

Github Workflow Build Status GitHub release License GitHub Stars GitHub Forks GitHub issues GitHub Contributors GitHub repo size

🐌 useful scripts for making developer's everyday life easier and happier, involved java, shell etc.

👉 平时有用的手动操作做成脚本,以便捷地使用,让开发的日常生活更轻松些。 💕

欢迎 👏 💖

本仓库的脚本(如Java相关脚本)在阿里等公司(如随身云,见awesome-scripts仓库说明)的线上生产环境部署使用。

如果你的公司有部署使用,欢迎使用通过 Issue:who's using | 用户反馈收集 告知,方便互相交流反馈~ 💗

repo-icon



🔰 快速下载&使用

source <(curl -fsSL https://raw.githubusercontent.com/oldratlee/useful-scripts/release-3.x/test/self-installer.sh)

更多下载&使用方式,参见下载使用

📚 使用文档

  1. show-busy-java-threads
    用于快速排查JavaCPU性能问题(top us值过高),自动查出运行的Java进程中消耗CPU多的线程,并打印出其线程栈,从而确定导致性能问题的方法调用。
  2. show-duplicate-java-classes
    找出jar文件和class目录中的重复类。用于排查Java类冲突问题。
  3. find-in-jars
    在目录下所有jar文件里,查找类或资源文件。

Shell使用加强:

  1. c
    原样命令行输出,并拷贝标准输出到系统剪贴板,省去CTRL+C操作,优化命令行与其它应用之间的操作流。
  2. coat and taoc
    彩色cat/tac出文件行,方便人眼区分不同的行。
  3. a2l
    按行彩色输出参数,方便人眼查看。
  4. uq
    不重排序输入完成整个输入行的去重。相比系统的uniq命令加强的是可以跨行去重,不需要排序输入。
  5. ap and rp
    批量转换文件路径为绝对路径/相对路径,会自动跟踪链接并规范化路径。
  6. cp-into-docker-run
    一个Docker使用的便利脚本。拷贝本机的执行文件到指定的docker container中并在docker container中执行。
  7. tcp-connection-state-counter
    统计各个TCP连接状态的个数。用于方便排查系统连接负荷问题。
  8. xpl and xpf
    在命令行中快速完成 在文件浏览器中 打开/选中 指定的文件或文件夹的操作,优化命令行与其它应用之间的操作流。

Shell开发/测试加强:

  1. echo-args
    输出脚本收到的参数,在控制台运行时,把参数值括起的括号显示成 红色,方便人眼查看。用于调试脚本参数输入。
  2. console-text-color-themes.sh
    显示Terminator的全部文字彩色组合的效果及其打印方式,用于开发Shell的彩色输出。
  3. parseOpts.sh
    命令行选项解析库,加强支持选项有多个值(即数组)。

🎓 Developer Guide

为用户提供有用的功能,当然是这个库的首要的价值体现和存在理由。

但作为一个开源项目,每个人都可以看到源码实现,这个库或许能做得更多。

🎯 面向开发者的目标

  • Shell/Bash作为线上生产环境使用的专业编程语言。
  • 期望体现Shell/Bash脚本 生产环境级的严谨开发方式与最佳实践,进而有可能示例与改善在生产环境中Shell脚本的质量状况。

PS:

  • 虽然上面是自己期望的目标,但自己在Shell语言上一定会有很多理解和使用上的问题、在这些实现脚本中也会很多需要的改进,可以一起学习、讨论与实践~ 💕
  • 这个库中脚本的实现也有使用Python

关于Shell脚本

命令行(CLI)几乎是每个程序员每天都在使用的工具。相比图形界面工具(GUI),命令行有着自己不可替代的便利性和优越性。

命令行里写出来其实就是Shell脚本,可以说每个开发者会写Shell脚本(或多或少)。在生产环境的功能实现中,也常会看到Shell脚本(虽然不如主流语言那么常见)。

可能正因为上面所说的Shell脚本的便利性和大众性:

  • Shell脚本有不少是顺手实现的(包括生产环境用的Shell脚本);
  • Shell脚本的实现常常可能质量不高,会引发线上严重的故障。

🚦 开发约定

在这个库中的Shell脚本:

  • 统一使用Bash 3.2+
  • 面向生产环境,尽可能使用严谨安全的开发方式。

ShellBash的原因是:

  • 目前仍然是主流的Shell,并且在不同环境基本上都缺省部署了。
  • GoogleShell风格指南中,明确说到了:Bash唯一被允许执行的shell脚本语言。
  • 统一用Bash,可以避免不同Shell之间差异所带来的风险与没有收益的复杂性。
    • 有大量的Shell实现,shbashzshfishcshtcshkshashdash……
    • 不同的Shell有各种差异,深坑勿入。
  • 个人系统学习过的是Bash,比较理解熟悉。

PS: 虽然交互Shell个人已经使用Zsh + oh-my-zsh,但在严谨的Shell脚本开发时还是使用Bash

📚 Shell学习与开发的资料

更多资料参见 子文档

useful-scripts's People

Contributors

gitter-badger avatar hyperupcall avatar ivanzhangwb avatar khotyn avatar liuyangc3 avatar melin avatar oldratlee avatar silentforce avatar sunuslee avatar superhj1987 avatar tg123 avatar toolchainx avatar xiongchen2012 avatar zavakid avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

useful-scripts's Issues

重命名仓库名:useful-shells -> useful-scripts

因为不仅使用shell,也可以使用pythonruby等脚本语言来实现,因为:

  • 这些语言可以更方便的实现功能。
  • 这些脚本语言也是系统的标配,一样的可以保证方便直接就可运行。

add bash/shell programming best practice in documentation

👷 Bash/Shell最佳实践与安全编程

🎶 Tips

💎 系统学习

看文章、了解Tips完全不能替代系统学习才能真正理解并专业开发!

更多参见 书籍豆列 Bash/Shell

提供重复Java依赖的脚本

java开发的一个麻烦的问题是jar冲突,或者说多个版本的jar。

会出NoSuchMethod等的问题,还不见得当时出问题。

这个脚本找出有重复类的jar,用于防患未然。

parseOpts兼容Bash 3.0

支持bash 3.0,要修改2点:

  • local声明数组变量时 要加上 -a
  • += 不支持,即a+=xxx改成a="$a xxx"

多谢 @khotyn

  • 提出bash 3.0下使用有问题
  • 提供bash 3.0的测试机器,以完成环境测试

bash 3.0测试机器信息:

$ bash --version
GNU bash, version 3.00.15(1)-release (i386-redhat-linux-gnu)
Copyright (C) 2004 Free Software Foundation, Inc.
$ uname -a
Linux sofatest-1.stack.alipay.net 2.6.9-103.ELxenU #1 SMP Wed Mar 14 16:31:15 CST 2012 i686 i686 i386 GNU/Linux

show-busy-java-threads support MacOS

  • Mac下使用解析命令行参数出错。Macgetopt不兼容GNU
    • 这个不是问题。自己手动来解析 来实现即可。
  • Macshow-busy-java-threads出错。Macps不兼容GNU
    • 比如 不支持 输出 线程ID(即 -L 选项)。
      • Mac下的ps-L是:
        List the set of keywords available for the -O and -o options.

java-busy-thread 中 printStackOfThread 函数的性能优化

#!/bin/bash

printStackOfThread_new() {
  while IFS=" " read -a line ; do
    local pid=${line[0]}
    local threadId=${line[1]}
    local threadId0x=`printf %x ${threadId}`
    local user=${line[2]}
    local pcpu=${line[4]}
  done
}


printStackOfThread() {
  while read threadLine ; do
    local pid=`echo ${threadLine} | awk '{print $1}'`
    local threadId=`echo ${threadLine} | awk '{print $2}'`
    local threadId0x=`printf %x ${threadId}`
    local user=`echo ${threadLine} | awk '{print $3}'`
    local pcpu=`echo ${threadLine} | awk '{print $5}'`
  done
}

test() {
  ps -Leo pid,lwp,user,comm,pcpu --no-headers| {
    [ -z "${pid}" ] && awk '$4=="java"{print $0}'|| awk -v "pid=${pid}" '$1==pid,$4=="java"{print $0}'
  } | printStackOfThread
}

test_new() {
  ps -Leo pid,lwp,user,comm,pcpu --no-headers| {
    [ -z "${pid}" ] && awk '$4=="java"{print $0}'|| awk -v "pid=${pid}" '$1==pid,$4=="java"{print $0}'
  } | printStackOfThread_new
}

time test
time test_new

快9倍

real    0m0.361s
user    0m0.013s
sys     0m0.040s
----
real    0m0.043s
user    0m0.012s
sys     0m0.015s

望采纳~

show-busy-java-threads.sh很好用,提供一个简单的脚本

#!/bin/bash
url=$(svn info | grep "^URL" | awk '{print $2}')
echo $url
echo -n $url | pbcopy

简单的一个, 经常要查看svn 分支,然后拷贝,写个简单的脚本可以省去鼠标拷贝svn url信息
(mac 下测试过,linux 可以将 pbcopy替换成对应的命令.)

parseOpts:检查函数,没有使用全局变量

除了下面的全局变量:

 * _OPT_INFO_LIST_INDEX : Option info, data structure.
                          _OPT_INFO_LIST_INDEX ->* _a_a_long -> option value.
 * _OPT_VALUE_* : value of option. is Array type for + mode option
 * _OPT_ARGS : option arguments

PS:
perl可以use strict,即变量使用前必须声明。
搜了一下Bash,没有找到类似的功能,先人肉检查代码,在变量使用前先中先用local声明。
这样来保证在函数中没有导出不预期的全局变量。

实现解析函数ParseOpts:支持选项的值是数组

选项的值是数组。find命令的-exec选项即是数组类型的:

find . -exec echo -e {} \;

上面Case的-exec的值是 echo -e {},包含了3个元素。

实际上这个选项可以多次指定:

find . -exec echo "find file:" \; -exec echo -e {} \; 

测试Case

  • 没有参数:
    parsh.sh
  • 长短选项都能读到的值,且一样:
    echo "$_OPT_VALUE_a $_OPT_VALUE_a_long"
  • 支持不同位置的参数,开头、中间、--之后:
    ./parse.sh 00 -a -c c.sh a b \; -b x aa bb cc -- dd ee

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.