GitHub 上有什麼好的或者有趣的 Shell 項目?


年度最佳出爐了!github上的2萬stars項目: hacker scripts.

https://github.com/NARKOZ/hacker-scripts

究竟是什麼樣的項目能在超短時間內在github拿到如此多的stars,看看說明文檔:

Hacker Scripts

Based on a _[true story](Now that"s what I call a Hacker)_:

這是一個基於真實的故事。

xxx: OK, so, our build engineer has left for another company. The dude was literally living inside the terminal. You know, that type of a guy who loves Vim, creates diagrams in Dot and writes wiki-posts in Markdown... If something - anything - requires more than 90 seconds of his time, he writes a script to automate that.

xxx: 哎呀我們的build engineer跳槽到另一家公司了。這哥們兒基本上就是活在終端里。你知道的,就是那種超愛Vim、編輯圖表使用Dot、就連寫維基都使用Markdown的那類人。如果什麼事情,不對,是任何事情,只要花費他90秒的時間,他就寫個腳本,自動執行。

xxx: So we"re sitting here, looking through his, uhm, "legacy"

xxx: 那麼讓我們坐在這兒,來看看他的。。。。呃。。。「遺產」。

xxx: You"re gonna love this

xxx: 你會愛上這一切的。

xxx: [`smack-my-bitch-up.sh`](hacker-scripts/smack-my-bitch-up.sh at master · NARKOZ/hacker-scripts · GitHub) - sends a text message "late at work" to his wife (apparently). Automatically picks reasons from an array of strings, randomly. Runs inside a cron-job. The job fires if there are active SSH-sessions on the server after 9pm with his login.

xxx:smack-my-bitch-up.sh - 給這賤人一巴掌.sh - 給他的老婆大人(顯然的)發送一條「加班回家晚了」的簡訊。 隨機地自動地從一個字元串的數組中挑選一個原因。在cron-job里運行,只要在晚上九點之後,伺服器上有他的SSH活動進程這個任務就會自動運行。

xxx: [`kumar-asshole.sh`](hacker-scripts/kumar-asshole.sh at master · NARKOZ/hacker-scripts · GitHub) - scans the inbox for emails from "Kumar" (a DBA at our clients). Looks for keywords like "help", "trouble", "sorry" etc. If keywords are found - the script SSHes into the clients server and rolls back the staging database to the latest backup. Then sends a reply "no worries mate, be careful next time".

xxx:kumar-asshole.sh - Kumar這個傻X.sh - 在郵箱里掃描「Kumar" (客戶里的一位DBA)的郵件。一旦找到「求助」,「難題」,「抱歉」等字眼,那麼這段腳本會自動ssh登錄客戶的伺服器,並且將現在的資料庫回滾到上個備份。然後回復:「沒關係兄弟,下次當心哦」。

xxx: [`hangover.sh`](hacker-scripts/hangover.sh at master · NARKOZ/hacker-scripts · GitHub) - another cron-job that is set to specific dates. Sends automated emails like "not feeling well/gonna work from home" etc. Adds a random "reason" from another predefined array of strings. Fires if there are no interactive sessions on the server at 8:45am.

xxx:hangover.sh - 宿醉.sh - 另外一個cron-job, 設定在某個特定的日子觸發。自動發送帶有「哎呀今個兒覺得身體欠佳啊 / 今天要在家裡工作"等等字樣的郵件。再從一個預定義的字元串數組中隨機選擇「原因」。在早上8:45伺服器上沒有活動的進程就會觸發。

xxx: (and the oscar goes to) [`fucking-coffee.sh`](hacker-scripts/fucking-coffee.sh at master · NARKOZ/hacker-scripts · GitHub) - this one waits exactly 17 seconds (!), then opens an SSH session to our coffee-machine (we had no frikin idea the coffee machine is on the network, runs linux and has SSHD up and running) and sends some weird gibberish to it. Looks binary. Turns out this thing starts brewing a mid-sized half-caf latte and waits another 24 (!) seconds before pouring it into a cup. The timing is exactly how long it takes to walk to the machine from the dudes desk.

xxx: (最牛逼來了) fucking-coffee.sh - 卧槽老子要喝咖啡了.sh - 這個腳本精確地等待17秒,17秒!然後打開一個SSH進程,到。。。我們的咖啡機上(誰tmd知道這台咖啡機是聯網的,運行著linux還有一個SSHD服務在運行啊@@)然後發送一串奇怪的字元給這台咖啡機。 瞧這個二進位代碼,原來運行以後,這台咖啡機開始煮一杯中等大小的一半低咖的拿鐵,然後在倒出咖啡前再精確地等待24秒!這個時間正正好好是這個哥們從辦公桌走到咖啡機的時間。

xxx: holy sh*t I"m keeping those

什麼?你也有同樣的需求?用法如下,就不翻譯啦~

Original: Цитата #436725 (in Russian)

Pull requests with other implementations (Python, Perl, Shell, etc) are welcome.

Usage

You need these environment variables:

```sh
# used in `smack-my-bitch-up` and `hangover` scripts
TWILIO_ACCOUNT_SID=ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
TWILIO_AUTH_TOKEN=yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy

# used in `kumar_asshole` script
GMAIL_USERNAME=admin@example.org
GMAIL_PASSWORD=password
```

For Ruby scripts you need to install gems:

gem install dotenv twilio gmail

Cron jobs

```sh
# Runs `smack-my-bitch-up.sh` daily at 9:20 pm.
20 21 * * * /path/to/scripts/smack-my-bitch-up.sh &>&> /path/to/smack-my-bitch-up.log 2&>1

# Runs `hangover.sh` daily at 8:45 am.
45 8 * * * /path/to/scripts/hangover.sh &>&> /path/to/hangover.log 2&>1

# Runs `kumar-asshole.sh` every 10 minutes.
*/10 * * * * /path/to/scripts/kumar-asshole.sh

# Runs `fucking-coffee.sh` hourly from 9am to 6pm.
0 9-18 * * * /path/to/scripts/fucking-coffee.sh
```

---

Code is released under WTFPL.

當然。。。還有R, coffee, go, groovy, java, nodeJs, perl, php, powershell, python, scala等多種版本語言實現。

最後。。。贊 License

WTFPL = DO What The Fuck you want to Public License


當然是 the fuck (nvbn/thefuck · GitHub)了!!!!

當你用 linux terminal 出現手腳無力、頭暈噁心,嚴重的話發生心肌梗塞的癥狀的時候,是不是想大叫 WTF ~~ 這個 shell 腳本將為你們帶來福音。

比如,你要安裝 vim 時:

? apt-get install vim
E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?

WTF !!此時,你應該狠狠地在 terminal 中打出:

? fuck
sudo apt-get install vim
[sudo] password for nvbn:
Reading package lists... Done
...

真是速效救心丸啊,心情瞬間順暢很多。

人生苦短,寫段 python 唄,於是你在 ternimal 中打出來:

? puthon
No command "puthon" found, did you mean:
Command "python" from package "python-minimal" (main)
Command "python" from package "python3" (main)
zsh: command not found: puthon

WTF !!! 手這麼殘!!不過沒事,快打出:

? fuck
python
Python 3.4.2 (default, Oct 8 2014, 13:08:17)
...

真特么爽。

ps: 我對題目一開始理解有誤,我剛開始一看 shell 項目,便想到 the fuck 了,但是沒想到它是 python 寫的,只是與 shell 有關罷了,當然,它非常有趣。大家開心就好。


oh-my-zsh必須算一個


幫肖同學做個廣告 https://github.com/elves/elvish

  • It attempts to prove that a shell language can be a handy interface to the operating system and a decent programming language at the same time; Many existing shells recognize the former but blatantly ignore the latter.

  • It attempts to build a better interface to the operating system, trying to strike the right balance between the tool philosophy of Unix and the tremendous usefulness of a more integrated system.

  • It also attempts to build a better language, learning from the success and failure of programming language designs.

  • It attempts to exploit a facility Shell programmers are very familiar with, but virtually unknown to other programmers - the pipeline.


著名的 powerline 現在核心部分是用 Python 寫的,然後可以被用在 Bash vim 等等地方。

還有一個 bash-powerline ,是純 Bash 實現的。原作者不怎麼活躍,我維護了一個 fork ,添加了一些功能: https://github.com/Hexcles/bash-powerline


Tmux是一個優秀的終端復用軟體,支持多標籤,也支持窗口內部面板的分割,更重要的是,Tmux提供了窗體隨時保存和恢復的功能。想像一下假如你在公司的伺服器上開了許多窗口調試程序,回到家時通過SSH連接公司電腦又要打開一堆繁瑣的窗口,而且還忘記了當時調試到哪一步了,那Tmux可以幫你解決這個難題,當SSH連接斷開重新連接後能夠恢復到原來的工作環境。

安裝

sudo apt-get install tmux

安裝完成後輸入tmux進入軟體,界面類似一個下方帶有狀態欄的終端。

基本概念

Tmux基於典型的c/s模型,主要分為會話、窗口和面板三個元素:

  • Session:輸入tmux後就創建了一個會話,一個會話是一組窗體的集合。
  • Window:會話中一個可見的窗口。
  • Pane:一個窗口可以分成多個面板。

圖中左下角的3顯示為當前會話,隨後1 vim,2 bash,3 ssh 分別是3個窗口,藍色bash表示當前窗口,圖中用藍色數字標記的1,2,3分別是bash窗口的三個面板。你還可以在tmux配置文件中給狀態欄添加時間、天氣等信息。

Tmux基本操作

Tmux的所有操作必須使用一個前綴進入命令模式,默認前綴為,很多人會改為,你可以修改tmux.conf配置文件來修改默認前綴:

#前綴設置為&
set -g prefix C-a
#解除&
ubind C-b

修改之後重啟Tmux生效,或者先按,然後輸入:,進入命令行模式, 在命令行模式下輸入:

source-file ~/.tmux.conf

你也可以在配置文件中加入下面這句話,以後改了配置文件只需要按前綴+r了。

#將r 設置為載入配置文件,並顯示"reloaded!"信息
bind r source-file ~/.tmux.conf ; display "Reloaded!"

加入如下幾條語句, 現在切換面板就和vim一樣了:

# map Vi movement keys as pane movement keys
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

複製/粘貼

  1. 按前綴+[ 進入複製模式
  2. 按 space 開始複製,移動游標選擇複製區域
  3. 按 Enter 複製並退出copy-mode。
  4. 將游標移動到指定位置,按前綴+ ] 粘貼

如果把tmux比作vim的話,那麼我們大部分時間都是處於編輯模式,只需要在配置文件(~/.tmux.conf)中加入如下行即可以像 vim一樣使用hjkl移動:

#copy-mode 將快捷鍵設置為vi 模式
setw -g mode-keys vi

會話的創建和保存

  • 終端運行tmux + 會話名,創建或打開會話
  • 前綴 + d 退出並保存會話

窗口操作

  • 前綴 + c 創建一個新的window
  • 前綴 + b 重命名當前window
  • 前綴 + 關閉當前window
  • 前綴 + n 移動到下一個窗口
  • 前綴 + p 移動到前一個窗口
  • 前綴 + l 切換到上一個窗口

面板操作

在配置文件中添加下面兩行就可以使用前綴+ |-來水平和垂直分割窗口:

# use PREFIX | to split window horizontally and PREFIX - to split vertically
bind | split-window -h
bind - split-window -v

添加如下命令到配置文件後後可以使用HJKL來調整窗口大小:

# resize panes using PREFIX H, J, K, L
bind H resize-pane -L 5
bind J resize-pane -D 5
bind K resize-pane -U 5
bind L resize-pane -R 5

其他操作:

  • + 方向鍵,切換窗口
  • + q 顯示所有面板
  • + !/x 關閉當前面板

查看所有的按鍵,使用& + ?

Tmux個性化

你可以使用tmux-powerline來美化你的狀態欄。

美化之後的效果是這樣的:


以往經驗告訴我,這種時候去GitHub搜索會更好~~

1.alebcay/awesome-shell · GitHub

A curated list of awesome command-line frameworks, toolkits, guides and gizmos.

2.progrium/bashstyle · GitHub

Let"s do Bash right!

授人以魚的同時授之以漁^_^


rupa/z · GitHub

誰用誰知道


https://github.com/mydzor/bash2048

用bash腳本實現的2048

更多的還是在awesome shell裡面

https://github.com/alebcay/awesome-shell


話說screenfetch算不算?


純shell的碰到的還是比較少,一般都是和shell結合

Flowerowl/ici · GitHub 終端上查單詞

robbyrussell/oh-my-zsh · GitHub oh-my-zsh

erikw/tmux-powerline · GitHub tmux的powerline樣式

turingou/douban.fm · GitHub 豆瓣FM終端版

joelthelion/autojump · GitHub autojump解決shell千年難題

holman/spark · GitHub ▁▂▃▅▂▇ in your shell.


denilsonsa / small_scripts
/ source / prettyping.sh

bash 的 ping wrapper,提供漂亮的 ping 結果顯示,代碼不是放在 github,但算是個很有趣的 shell tool。正好,因過年閑得蛋疼,邊學習 bash 邊開始寫的 qiuxiang/doubanfm.sh · GitHub


由 Aggressively Overuse Shell Community 開發的 autobuild 軟體包構建套件

Dev/Autobuild

https://github.com/AOSC-Dev/autobuild3

全 Bash 構成,編譯、Dpkg+RPM 一條龍打包,懶人必備。


我認真收集和找了下Shell編程在互聯網上推薦的有趣項目:

karpathy/char-rnn · GitHub :一個基於RNN的文本生成器。可以自動生成莎士比亞的劇本或者shell代碼。

phunterlau/wangfeng-rnn · GitHub : 基於char-rnn的汪峰歌詞生成器

google/deepdream · GitHub :畫出神經網路眼中的世界

facebook/MemNN · GitHub :memnn的一個官方實現。可以回答諸如「小明在操場;小王在辦公室;小明撿起了足球;小王走進了廚房。問:小王在去廚房前在哪裡?」,這樣涉及推理和理解的問題。

skaae/lasagne-draw · GitHub :用RNN生成手寫數字。

keras/addition_rnn.py at master · fchollet/keras · GitHub :用RNN自動學會加法規則。

karpathy/neuraltalk · GitHub :自動根據圖像生成文本描述。

ryankiros/neural-storyteller · GitHub: 看圖講故事

karpathy/neuraltalk2 · GitHub:看圖生成標註

jcjohnson/neural-style · GitHub:將照片變成大師風格的繪畫

Newmu/dcgan_code · GitHub: 卷積生成式對抗網路,生成圖像

nagadomi/waifu2x · GitHub:CNN來放大動漫圖片

去年我在Neuraltalk2 的基礎上做了個視頻字幕自動生成的實驗, 現在把代碼公布在Github上:

GitHub - cgq5/Video-Caption-with-Neuraltalk2: Code release of captioning videos using Neuraltalk2.

生成結果在這裡:youtube.com/watch?


p8952/bocker · GitHub

Docker implemented in around 100 lines of bash Peter Wilmott


oh-my-zsh算不


終端視頻聊天算不算?

mofarrell/p2pvc · GitHub


還有git-extras


curl http://wttr.in/chengdu

shell 上的天氣應用


給自己的項目打個廣告, Python 實現的命令行音樂播放器:

skyline75489/pyfm · GitHub


推薦閱讀:

GitHub 如何基於 Node.js 和 Chromium 開發 Atom?
在MSys版的Git中使用git pull --rebase進行代碼更新到底是做了什麼?
如何使用10個小時搭建出個人域名而又Geek的獨立博客?
GitHub 上有什麼好玩又有挑戰的前端項目?
SourceForge 是如何一步一步被 GitHub 超越的?

TAG:程序員 | 編程 | Linux | GitHub | Shell編程開發 |