加载中...

Hacking Bash


完全用 GNU/Linux 工作

09. Hacking Bash

真要说 GNU/Linux 有哪里吸引人,那就是 bash 里的纯文字世界了 (它可是比 Windows 上的命令提示字符还强大呢!),只要我们熟知各种指令及纯文字编辑器,就可以完全驾驭电脑,当电脑的主人。但 Bash 的博大精深冻仁很难用一篇文章来解释,这里只能简述些冻仁平时常用的部份,相信《鸟哥的 Linux 私房菜》上面会写的比冻仁更详细。

2013-05-20-linux_logo-on-centos5.png

▲ 原生的 Bash (on CentOS)。

补完自动补齐功能

开始前有个不得不提的好物,那就是 bash-completion,它可以强化 GNU/Linux 的自动补齐功能 (completion),但 CentOS 必须得自行加入 EPEL 来源的套件库才找的到 (详请可参考先前的 05. 套件库及镜像站 一文)。

安装

  1. # Debian, Ubuntu
  2. $ sudo aptitude install bash-completion
  3. # CentOS with epel repo.
  4. $ sudo yum install bash-completion

使用

  1. # Debian, Ubuntu
  2. $ sudo aptitude <Tab> <Tab> <Tab> ...
  3. # CentOS, RHEL, Fedora
  4. $ sudo yum <Tab> <Tab> <Tab> ...

冻仁的环境设定

如想取得完整的 bash 环境设定,请参考 冻仁的 GitHub。

  1. # 下載凍仁的環境設定。
  2. $ git clone https://github.com/chusiang/tuxENV.git
  3. # 切換目錄。
  4. $ cd tuxENV/
  5. # 備份原設定。
  6. $ make backup
  7. # 安裝。
  8. $ make install

以下设定可写入 $HOME/.bashrc,这样下次启动 bash 时设定才会存在。

将语系指定成英文语系 (en_US.UTF-8) :因 tty (Ctrl + Alt + F1) 底下默认不支援中文,故新增此设定,适合进阶使用者。

  1. # - language
  2. tty=`tty`
  3. t=`echo $tty|awk -F "/" '{print $3}'`
  4. if [ "$(tty)" = "/dev/tty1" ] || [ $t = pts ]; then
  5. export LANGUAGE="en_US.UTF-8"
  6. export LANG="en_US.UTF-8"
  7. export LC_ALL="en_US.UTF-8"
  8. fi

ls 颜色设定:部份的 GNU/Linux 使用 ls 时的颜色不易阅读,故手动更改。

  1. export LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:'
  • ls 颜色设定 (in Bash shell) - Tsung's Blog
  • COLORS Lscolors - Linux StepByStep

别名 (Alias)。

  1. alias la='ls -A'
  2. alias ll='ls -l'

自订 PS1 颜色:除了色彩较为丰富,也可用来辨识机器,以避免关错电脑。

  1. # == Colors ==
  2. red='\[\033[0;31m\]'
  3. RED='\[\033[1;31m\]'
  4. green='\[\033[0;32m\]'
  5. GREEN='\[\033[1;32m\]'
  6. yellow='\[\033[0;33m\]'
  7. YELLOW='\[\033[1;33m\]'
  8. blue='\[\033[0;34m\]'
  9. BLUE='\[\033[1;34m\]'
  10. purple='\[\033[0;35m\]'
  11. PURPLE='\[\033[1;35m\]'
  12. cyan='\[\033[0;36m\]'
  13. CYAN='\[\033[1;36m\]'
  14. white='\[\033[0;37m\]'
  15. WHITE='\[\033[1;37m\]'
  16. NC='\[\033[0m\]' # No Color
  17. PS1="${white}[ ${YELLOW}\u${RED}@\h ${PURPLE}\w ${white}] - \A \n${WHITE}\$ ${NC}"

2013-04-10-linuxlogl-debian.png

▲ 自订 PS1 后的 Bash (Debian)。。

  • Color Bash Prompt - ArchWiki

使用 Vi 模式控制 Bash,默认为 Emacs 模式。

  1. set -o vi

快捷键

快速搜寻使用过的指令。

  1. ESC + /
  2. Ctrl + r

往前删除一字符,同 Backspace 键。

  1. Ctrl + h

送出确认/回传,同 Enter 键。

  1. Ctrl + j

清除光标以前的一个单字。

  1. Ctrl + w

清除光标以前所有的字符。

  1. Ctrl + u

指令简介

常用指令

这里列出冻仁最常用的前 10 笔指令 (2013-01-25 21:47:40 ~ 2013-09-26 21:09:05)。

  1. $ history | awk '{print $2}' | sort | uniq -c | sort -nr | nl | less
  2. 1 2971 ls
  3. 2 2236 cd
  4. 3 1843 git
  5. 4 1180 sudo
  6. 5 484 cat
  7. 6 354 mv
  8. 7 354 gpg
  9. 8 322 vi
  10. 9 304 ssh
  11. 10 255 cp
ls

列出档案及目录。

  1. [ jonny@raspberrypi ~ ] - 21:42
  2. $ ls
  3. bin public_html tmp vcs
  4. [ jonny@raspberrypi /tmp ] - 21:43
  5. $
cd

切换目录。

  1. [ jonny@raspberrypi ~ ] - 21:42
  2. $ cd /tmp
  3. [ jonny@raspberrypi /tmp ] - 21:42
  4. $
git

可以让档案进行储存、分支的分布式版本控制系统,好比玩单机游戏时我们会先储存以得到最美好的结局。详情请参考 Git Magic - 前言 一文。

sudo

暂时取得管理者权限。议平时别用超级管理者登录,待有需要时再用 sudo,可有效降低人为失误的风险。详情请参考 冻仁的笔记: sudo 指令使用说明 一文。

  1. [ jonny@raspberrypi ~ ] - 21:45
  2. $ sudo /etc/init.d/nginx restart
  3. [sudo] password for jonny:
  4. Restarting nginx: nginx.
  5. [ jonny@raspberrypi ~ ] - 21:45
  6. $
cat

查看档案内容。

  1. [ jonny@raspberrypi ~ ] - 21:46
  2. $ cat /etc/issue
  3. Raspbian GNU/Linux 7 \n \l
mv

搬移档案及目录。

  1. [ jonny@raspberrypi ~/lab ] - 22:24
  2. $ ls
  3. 1234567
  4. [ jonny@raspberrypi ~/lab ] - 22:24
  5. $ mv 1234567 7654321; ls
  6. 7654321
gpg

加密、数位签章及产生非对称式金钥的软件,本次篇幅不会提到。,详情请参考 GnuPG - 维基百科 一文。

vi

使用 H, J, K, L 取代左、下、上、右移动的纯文字编辑器。详情请参考 [完全用 GNU/Linux 工作] 11. Hacking Vim 一文。

ssh

远端连线。

  1. [ jonny@thinkpad-t410 ~ ] - 23:28
  2. $ ssh jonny@192.168.11.6
  3. Linux raspberrypi 3.6.11+ #538 PREEMPT Fri Aug 30 20:42:08 BST 2013 armv6l
  4. The programs included with the Debian GNU/Linux system are free software;
  5. the exact distribution terms for each program are described in the
  6. individual files in /usr/share/doc/*/copyright.
  7. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
  8. permitted by applicable law.
  9. Last login: Thu Sep 26 23:19:56 2013 from 192.168.11.9
  10. [ jonny@raspberrypi ~ ] - 23:28
  11. $
cp

复制档案。

  1. [ jonny@thinkpad-t410 ~/tmp/lab ] - 23:48
  2. $ ls
  3. tux.txt
  4. [ jonny@thinkpad-t410 ~/tmp/lab ] - 23:48
  5. $ cp tux.txt helloTu.txt
  6. [ jonny@thinkpad-t410 ~/tmp/lab ] - 23:48
  7. $ ls
  8. helloTu.txt tux.txt

进阶指令

将使用 markdown 语法所撰写的的文件 07.ufw.md 借由 markdown_py 转换成 HTML 格式,并导向 (>) 指定的档案 07.ufw.html。

  1. $ markdown_py 07.ufw.md > 07.ufw.html

使用 cat 检视档案,并将结果丢给管线 (pipe) 后的程式处理 (xlip: 复制内容至剪贴簿)。

  1. $ cat 07.ufw.html | xclip

透过 grep 过滤出已安装的套件。

  1. $ sudo aptitude search vim | grep ^i
  2. i vim - Vi IMproved - enhanced vi editor
  3. i A vim-addon-manager - manager of addons for the Vim editor
  4. i vim-common - Vi IMproved - Common files
  5. i vim-gnome - Vi IMproved - enhanced vi editor - with GN
  6. i A vim-gui-common - Vi IMproved - Common GUI files
  7. i A vim-runtime - Vi IMproved - Runtime files
  8. i vim-syntax-gtk - Syntax files to highlight GTK+ keywords in
  9. i vim-tiny - Vi IMproved - enhanced vi editor - compact

借由指令操控一切真的是一件令人高兴的事情,但有些时后它不见得符合我们的需求,这时就可借由指令的大集合“Shell Scripts”来达到深层的客制化指令。

资料来源

  • bash shell 入门 第三版 | O'Reilly
  • 冻仁的笔记: bash
  • 冻仁的笔记: Shell Scripts

还没有评论.