技术开发 频道

Linux用户都应了解的命令行省时技巧

  【IT168 评论】有网友在问答网站Quora上提问:“有哪些省时小技巧,是每个Linux用户都应该知道的?” Joshua Levy 平常就在 Linux 平台工作,并且他积累了不少实用命令行技巧,他在回复中精选出一部分。对技术用户来说,这些技巧挺重要或实用,但知道的人并不多。下文略有点长,一般来说,用户也不需要对全部内容都了解,但为了达到省时方便的目的,Joshua Levy 仍不遗余力做了校对,以保证列出的每一条都值得一读,前提是你是一位Linux重度用户。

  为了获取文中提到的一个命令的更多信息,先试下“man <命令名称>”,在一些情况下,为了让这条命令可以正常执行,你必须安装相应的包,可以用aptitude 或者 yum。如果失败了,求助Google。

  基础篇

  学习基础的Bash。事实上,读整个的bash的帮助手册;很容易理解而且篇幅也不算长。其他一些可选的shell外观可能更漂亮,但是bash功能很强大而且总是能用(主要学习zsh或者tcsh在很多情况下你会受到限制)。

  学习vim,对于Linux下的随机编辑,几乎没有工具能出其右(即使你大部分的时间里都在使用Emacs或者Eclipse)。

  通过ssh-agent,ssh-add等命令,了解ssh,以及跳过每次登陆时密码验证的基础办法,。

  熟悉bash下的工作管理: &,Ctrl-Z,Ctrl-C,jobs,fg,bg,kill, 等等。

  基础的文件管理:ls 以及 ls -l (特别的,学习”ls -l”中列出的每一列字段的含义),less,head,tail,tail -f,ln,ln -s (学习软链接和硬链接的区别),chown,chmod,du(快速了解磁盘总体占用情况),df,mount。

  基础的网络管理命令:ip 或者 ifconfig,dig。

  了解正则表达式,以及grep、egrep的不同命令选项,-0,-A,-B 都值得了解一下。

  学习使用apt-get 或者 yum(取决于你的发行包)来找到并安装你需要的包.

  日常使用篇

  使用bash时,用Ctrl-R来搜索命令的历史记录。

  使用bash时,用Ctrl-W来清除最后一个单词,使用Ctrl-U来清除整行。可以查看man readline来获取bash里面默认键的绑定设置。内容很多。比如Alt-.(注:点)遍历之前命令中使用过的参数,Alt-* 扩展了参数的匹配模式。

  回到上次的工作目录:cd -。

  如果你的命令敲到一半时改变了主意,可以用Alt-#来在命令前面增加一个#,使之成为一行注释(或者使用Ctrl-A回到命令开头,然后再键入#)。你可以之后再通过搜索历史记录回来。

  使用xargs(或者parallel)。它非常强大。注意你能控制每一行(-L)执行多少项,也能控制如何并发(- P)。如果你不太确定它会如你所愿的工作,先使用xargs。 再者,-l{} 很有用。例如:

  find . -name \*.py | xargs grep some_function
  cat hosts | xargs -l{} ssh root@{} hostname
  pstree -p 可以很方便的显示整个进程树。

  使用pgrep 和pkill 来通过名字来发现进程或者给进程发信号(-f选项会有用)。

  了解你能向进程发送的信号种类。比如,要挂起一个进程,使用kill -STOP [进程ID]。要了解整个列表,请参考man 7 signal。

  如果你想让一个后台进程一直运行,使用nohup or disown 。

  通过netstat -lntp 来检测哪些进程在监听。同样可以用lsof。

  bash脚本中,使用set -x 来调试输出。使用set -e在有错误时终止时终止执行。要想严格输出错误,可以考虑使用set -o pipefail(虽然这个主题说起来有些复杂)。对于更复杂的脚本,也可以使用trap。

  bash脚本中,子shell(通过写在括号里)是一种组织命令的方便的方法。一个很常见的例子是暂时移动到另外一个工作目录,例如:

  #在当前目录下做一些事情
  (cd /一些/另外的/目录;执行别的操作)
  #继续在原来的目录下执行

  要注意bash中有很多种变量表达式。检查一个变量是否存在:${name:?错误信息}。例如:如果一个bash脚本需要一个单变量,只需要写input_file=${1:?usage: $0 inpute_file}。数值扩展:i=$({(i+1)%5})。序列:{1..10}。字符串的整理:${var%suffix} 和${var#prefix}。例如:

  if var==foo.pdf, then echo ${var%.pdf}.txt #会打印"foo.txt"。

  通过 <(其他指令),一条命令的输出可以被当作是一个文件的内容来对待。 例如,比较本地和远程的 /etc/hosts 文件,可以用diff /etc/hosts <(ssh [远程主机] cat /etc/hosts)。

  了解bash中的“here documents”,比如 cat <<EOF …

  bash中,通过 其他指令 > 日志文件 2>&1 把标准输出以及标准错误重定向。常见的情况是,为了保证一条指令没有为标准输入留下一个打开的文件描述符,从而输出至你当前所在的终端,增加“</dev/null” 也是好的习惯。

  用man ascii可以得到一个完整的ASCII表,有对应的16进制和10进制的值。

  通过ssh连接远程终端时,使用screen或者dtach 来保持你的session,防止被打断。在ssh中,了解如何使用-L或者-D选项(有时也会用到-R)会很有用处,比如,如果通过从一个远程的服务器访问一个网页。

  优化你的SSH选项也可能管用。比如,下面的.ssh/config 内容在一些网络环境下可以防止连接掉线,当连接到新主机时不需要再次确认,跳转验证,并且还使用了压缩(对在一些低宽带的连接环境下使用scp时会有帮助)。

  TCPKeepAlive=yes
  ServerAliveInterval=15
  ServerAliveCountMax=6
  StrictHostKeyChecking=no
  Compression=yes
  ForwardAgent=yes
0
相关文章