Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Effective linux.1.(commandline)

1,238 views

Published on

dancing in commandline

Published in: Technology
  • Be the first to comment

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>

×