Effective linux.1.(commandline)

1,038 views

Published on

dancing in commandline

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,038
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
26
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

Effective linux.1.(commandline)

  1. 1. Effective Linux (1) commandline hongjiang 2012.2.29
  2. 2. Dancing in commandline <ul><li>1) getting to know your shell </li></ul><ul><li>2) shortcut keys </li></ul><ul><li>3) command history </li></ul><ul><li>4) tips (bash & zsh) </li></ul>
  3. 3. 我的终端环境 <ul><li>xubuntu(11.10) + zsh(4.3.11) + gnome-terminal(3.0.1) </li></ul><ul><li>zsh 的语法与 bash 接近,两者相互借鉴 </li></ul><ul><li>有关 zsh 的技巧,可参考我 delicious 收录的 </li></ul><ul><li>http://delicious.com/w.hongjiang/zsh </li></ul>
  4. 4. 了解你所用的 shell <ul><li>$ echo $SHELL 看到的结果可靠吗? </li></ul><ul><li>假设默认是 Bash ,执行下面的,结果是什么结果 </li></ul><ul><li>$ ksh </li></ul><ul><li>$ echo $SHELL </li></ul><ul><li>那么 $SHELL 变量是从哪里来的? </li></ul><ul><li>$ cat /etc/passwd | grep $UID </li></ul><ul><li>或 </li></ul><ul><li>$awk -F: '/'&quot;$UID&quot;'/{print $NF}' /etc/passwd </li></ul><ul><li>另: $SHELL 是可被改写的 </li></ul>
  5. 5. 了解你所用的 shell <ul><li>正确的方式: </li></ul><ul><li>$ ps –fp $$ </li></ul><ul><li>UID PID PPID C STIME TTY TIME CMD </li></ul><ul><li>1000 2454 2449 0 22:53 pts/1 00:00:00 /usr/bin/zsh </li></ul><ul><li>$$ 是大多 shell 内置变量,表示当前进程 ID </li></ul><ul><li>$$ 变量不可被改变 </li></ul>
  6. 6. 了解你所用的 shell <ul><li>脚本首行声明为 #!/bin/sh </li></ul><ul><li>但你能确定它以那种 shell 执行么? </li></ul><ul><li>为什么 jetty 的脚本里不那么写,而写为 </li></ul><ul><li>#!/usr/bin/env bash </li></ul>
  7. 7. 了解你所用的 shell <ul><li>Debian/Ubuntu 下 /bin/sh 是 /bin/dash 的一个软连接 </li></ul><ul><li>Redhat/CentOS 下 /bin/sh 是 /bin/bash 的软连接 </li></ul><ul><li>$ apt-cache show dash </li></ul><ul><li>Debian Almquist Shell (dash) 是一款兼容 POSIX 的 shell ,衍生自 ash 。由于它执行脚本比 bash 快,依赖的库少 ( 使得它更稳健,受软硬件故障影响少 ) , Debian 使用它作为默认的系统 shell 。 </li></ul><ul><li>Dash 与 Bash 的差异? </li></ul><ul><li>http://www.igigo.net/archives/169 </li></ul>
  8. 8. 了解你所用的 shell <ul><li>shell 配置的执行顺序 </li></ul><ul><li>1: /etc/profile </li></ul><ul><li>2: ~/.bash_profile 如果有则执行 </li></ul><ul><li>3: ~/.bash_rc 如果有则执行 </li></ul><ul><li>4: ~/.bash_login 如果有则执行 </li></ul><ul><li>5: ~/.profile 如果有则执行 </li></ul><ul><li>注: redhat 里 .bash_rc 是由 .bash_profile 去调用的 </li></ul>
  9. 9. 了解你所用的 shell <ul><li>bash 下通过 set 和 shopt 命令设置 </li></ul><ul><li>eg: set –e </li></ul><ul><li>默认情况下 shell 脚本中某一行出错,后续的代码仍会执行的。当设置了 -e 参数,每行命令若以非零值返回 , 则立即退出。 </li></ul><ul><li>Every script you write should include set -e at the top. </li></ul><ul><li>zsh 下通过 set 和 setopt 命令设置 </li></ul>
  10. 10. 了解你所用的 shell <ul><li>常见重定向 </li></ul><ul><li>cmd > file 2>file 与 cmd > file 2>&1 的差异 </li></ul><ul><li>command > file 2>file 的意思是将命令所产生的标准输出信息 , 和错误的输出信息送到 file 中 . </li></ul><ul><li>command > file 2>file 这样的写法 ,stdout 和 stderr 都直接送到 file 中 , file 会被打开两次 , 这样 stdout 和 stderr 会互相覆盖 , 这样写相当使用了 FD1 和 FD2 两个同时去抢占 file 的管道。 </li></ul><ul><li>而 command >file 2>&1 这条命令就将 stdout 直接送向 file, stderr 继承了 FD1 管道后 , 再被送往 file, 此时 ,file 只被打开了一次 , 也只使用了一个管道 FD1, 它包括了 stdout 和 stderr 的内容。 </li></ul>
  11. 11. 了解你所用的 shell <ul><li>zsh 中的重定向,花样更多一些 </li></ul><ul><li>http://www.cs.elte.hu/zsh-manual/zsh_7.html </li></ul><ul><li>或见 zsh-lovers 中的 Redirection-Examples </li></ul>
  12. 12. 快捷键 <ul><li>先解决冲突 </li></ul><ul><li>Alt + F 会先被应用程序菜单快捷键所捕获的问题 : </li></ul><ul><li>隐藏 gnome-terminal 的 menubar </li></ul><ul><li>$ gconftool --type boolean --set /apps/gnome-terminal/profiles/Default/default_show_menubar false </li></ul><ul><li>若要想显示,鼠标右键有显示菜单栏的选项。 </li></ul>
  13. 13. 快捷键 <ul><li>Ctrl + u 删除整行 </li></ul><ul><li>Ctrl + k 删除光标到行尾 (Ctrl +a , Ctrl + k 相当于 Ctrl + u) </li></ul><ul><li>Ctrl + w 删除前一个单词 Alt + Backspace 也是类似效果 </li></ul><ul><li>Alt + d 删除后一个单词 </li></ul><ul><li>Ctrl + h 向前删除一个字符 </li></ul><ul><li>Ctrl + d 向后删除一个字符 </li></ul><ul><li>Ctrl + y 粘贴所删除的 </li></ul><ul><li>Ctrl + f 向右移动 Alt + f 向右移动一个单词 </li></ul><ul><li>Ctrl + b 向左移动 Alt + b 向左移动一个单词 </li></ul>
  14. 14. 快捷键 <ul><li>_ 表示光标所在位置: </li></ul><ul><li>$ command arg1 _ arg2 arg3 </li></ul>C+A C+E C+F C+B Alt+F Alt+B
  15. 15. 快捷键 <ul><li>gnome-terminal 下滚动屏幕的快捷键 </li></ul><ul><li>bash 和 zsh 默认是 Shift+PgUp 和 Shift+PgDn 用来翻屏。 </li></ul><ul><li>Ctrl+Shift+ 上 / Ctrl+Shift+ 下 ,则是向上和向下滚动一行。 </li></ul><ul><li>see: </li></ul><ul><li>http://library.gnome.org/users/gnome-terminal/stable/gnome-terminal </li></ul><ul><li>Ctrl+PgUp/PgDn 相当于 Alt+1/2/3 切换到下一个 tab </li></ul><ul><li>Ctrl+Shit+PgUp/PgDn 则将当前 tab 左移或者右移 </li></ul><ul><li>注:解决 screen 中屏幕滚动的问题, see my screenrc </li></ul>
  16. 16. 快捷键 <ul><li>命令行输入了一半后,发现需要先执行某个命令 </li></ul><ul><li>比如 , cd /tmp/dd ,还没有输入完,发现需要先创建这个目录。以往的做法是 Ctrl+a 到命令的前头,输入 </li></ul><ul><li>$ mkdir /tmp/dd && cd /tmp/dd </li></ul><ul><li>简单的方式是, Ctrl+u 删除此行命令,然后执行其他命令之后,再 Ctrl+y 粘贴之前的命令 </li></ul><ul><li>zsh 下, 用 alt+q 可以替代上面的两步 ctrl+u , ctrl + y </li></ul>
  17. 17. 历史命令 <ul><li>快速执行历史的第 n 个命令 </li></ul><ul><li>$ history </li></ul><ul><li>$ !100 </li></ul><ul><li>快速的执行上一个命令 </li></ul><ul><ul><li>$ !! </li></ul></ul><ul><li>执行一个命令后,发现权限不足 </li></ul><ul><li>$ sudo !! </li></ul>
  18. 18. 历史命令 <ul><li>调用上一个命令中的参数 </li></ul><ul><li>eg: 创建了一个路径很长的目录 </li></ul><ul><li>$ mkdir /verylongpath/dir </li></ul><ul><li>$ cd 到刚才创建的目录,要再敲一边? </li></ul><ul><li>Alt + . (或 Esc + . ) 可以调出上个命令的参数 </li></ul>
  19. 19. 历史命令 <ul><li>$ echo !* 上个命令中的所有参数 </li></ul><ul><li>$ echo !^ 上个命令中的第一个参数 </li></ul><ul><li>$ echo !$ 上个命令中的最后一个参数 </li></ul><ul><li>$ echo !:n 上个命令中的第 n 个参数 </li></ul><ul><li>$ !!:p 显示上个命令,但不执行 </li></ul>
  20. 20. 历史命令 <ul><li>在多个终端中共享历史命令 </li></ul><ul><li>zsh 在 .zshrc 中增加一行: </li></ul><ul><li>setopt histignorealldups sharehistory </li></ul><ul><li>bash </li></ul><ul><li>$ echo &quot;shopt -s histappend&quot; >> ~/.bashrc </li></ul><ul><li>$ echo &quot;PROMPT_COMMAND=&quot;history -a; $PROMPT_COMMAND&quot;&quot; >> ~/.bashrc </li></ul>
  21. 21. 历史命令 <ul><li>对 ctrl-r 的增强 </li></ul><ul><li>bash 中绑定 up 和 down 在匹配的条件中选择 </li></ul><ul><li>bind '&quot;e[A&quot;: history-search-backward' </li></ul><ul><li>bind '&quot;e[B&quot;: history-search-forward' </li></ul><ul><li>zsh 中的绑定: </li></ul><ul><li>bindkey &quot;^[[A&quot; history-search-backward </li></ul><ul><li>bindkey &quot;^[[B&quot; history-search-forward </li></ul><ul><li>这样 ctrl-r 后搜索 mvn 然后可以用 up/down 选择所有 mvn 的历史命令 </li></ul><ul><li>或输入 mvn 然后用 up/down 选择所有历史命令中以 mvn 开头的 </li></ul>
  22. 22. tips <ul><li>终端退出后,进程也被中止了,如何避免? </li></ul><ul><li>1) 是 Daemon 程序 : nohup , disown </li></ul><ul><li>2) 是交互操作: screen </li></ul><ul><li>思考: java xxx & 关闭终端, java 进程是否还会存在? Java –server 模式呢? ppid 变成了谁? </li></ul>
  23. 23. tips <ul><li>正确的结束一个进程 </li></ul><ul><li>我们的 web server 脚本里直接用 kill -9 是否合适? </li></ul><ul><li>若 java 程序在 exit 时执行了 hook , Runtime.getRuntime().addShutdownHook </li></ul><ul><li>会如何? </li></ul><ul><li>参考 jetty 脚本里的结束方式。 </li></ul><ul><li>先发送 HUP 信号 (1) ,不灵再 发送 KILL 信号 (9) </li></ul>
  24. 24. tips <ul><li>Screen 的配置 </li></ul><ul><li>我的 .screenrc </li></ul><ul><li>defscrollback 30000 </li></ul><ul><li>hardstatus alwayslastline &quot;%{=b}%{-b}%{R}[%{=b B}%-w%{=b BK}%>%n %t%{-}%+w%{-b}%< %=%{R}]%{G}[%Y-%m-%d %c]&quot; </li></ul><ul><li>termcapinfo xterm* ti@:te@ </li></ul><ul><li>设置 screen 默认的 shell </li></ul><ul><ul><li>alias screen='screen -s zsh' </li></ul></ul>
  25. 25. tips <ul><li>bash 快速 cd 到上层任何指定路径 </li></ul><ul><li>$ upto() { cd &quot;${PWD//$@/*//$@}&quot; } </li></ul><ul><li>$ pwd </li></ul><ul><li>/a/very/long/cumbersome/directory </li></ul><ul><li>$ upto very </li></ul><ul><li>$ pwd </li></ul><ul><li>/a/very </li></ul><ul><li>将 upto 函数放入 .bashrc 里 </li></ul>
  26. 26. tips <ul><li>bash 里转换大小写的函数 </li></ul><ul><li>commandfu 上面看到的: </li></ul><ul><li>注意,仅仅限于 bash ,也就时说需严格用 #!/bin/bash </li></ul><ul><li>$ lower() { echo ${@,,}; } </li></ul><ul><li>$ upper() { echo ${@^^}; } </li></ul>
  27. 27. tips <ul><li>比较两个 antx.properties 不同之处 </li></ul><ul><li>$ cat t1 t2 | sort -u | awk -F= '{a[$1]++;m[$1]=m[$1]&quot; &quot;$2} </li></ul><ul><li>END{for(i in a) if(a[i] == 2)print i&quot;= &quot;m[i]}' </li></ul>
  28. 28. tips <ul><li>2012 年有几个黑色星期五?苹果会不会再打折? </li></ul><ul><li>$ export LANG=en_US.utf-8 </li></ul><ul><li>$ for i in {1..12};do ncal -m$i | grep -E &quot;2012|Fr.*13&quot; | grep -B1 &quot;Fr&quot; ; done </li></ul>
  29. 29. tips <ul><li>最简单的通过 http 方式共享当前目录 </li></ul><ul><li>$ python –m SimpleHTTPServer </li></ul>

×