bash

Linux Tricks (1)

本文在署名-非商业性使用-相同方式共享 3.0版权协议下发布, 转载请注明出自aifreedom.com

之前写过一段时间的 Linux 日记, 后来没有继续更新了. 但我发现把在使用 Linux 的过程中解决某些问题的过程用文字记录下来是很有用的! 比如前些天我的同学问我 Mplayer 的 RMVB 解码器是哪个包, 我却记不起来了. 但我记得我写过一篇日志记录了我解决这个问题的过程, 于是他的问题也顺利解决了.

我一直认为学习的过程就是”不断遇到问题, 并寻求解决问题的方法”的过程. 把这个过程记录下来, 就为自己再次重温这个过程留下了线索. 这也就是笔记的重要性. 我在上课时很少做笔记, 但阅读有价值的书是一定要做笔记的. 计划等我有一大段空闲时间了就去整理我的笔记, 把他们都整理成 TeX 文件或者 Muse 文件.

现在这个 “Linux Tricks” 系列, 每一篇都不会太长, 内容比较杂乱, 但涉及的方面会很多. 很多的 Trick 都是从论坛或者 Blog 上看来的, 把它们集中在一起, 既方便了我日后查看, 又传播了 Linux 的文化.

今天的两个Tricks分别从徐宥TualatriX 处学到, 感谢他们的分享.

1. 史上最强 PS1

这里说的 PS1 不是 Sony 的 Play Station I, 是 Bash Shell 的提示字符串(Prompt String). 就是下图中 “$” 字符前的那些信息.

Snapshot of the shell with the PS1 above

if [ -n "$force_color_prompt" ]; then
    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
	# We have color support; assume it's compliant with Ecma-48
	# (ISO/IEC-6429). (Lack of such support is extremely rare, and such
	# a case would tend to support setf rather than setaf.)
	color_prompt=yes
    else
	color_prompt=
    fi
fi

if [ $color_prompt=yes ]; then
    PS1='`a=$?;if [ $a -ne 0 ]; then echo -n -e "\[\e[01;32;41m\]{$a}"; fi`\[\033[01;32m\]\u@\h\[\033[00m\] \[\033[01;34m\]\W`[[ -d .git ]] && echo -n -e "\[\e[33;40m\](branch:$(git branch | sed -e "/^ /d" -e "s/* \(.*\)/\1/"))\[\033[01;32m\]\[\e[00m\]"`\[\033[01;34m\] $ \[\e[00m\]'
    # PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='`a=$?;if [ $a -ne 0 ]; then echo -n -e "{$a}"; fi`\u@\h \W`[[ -d .git ]] && echo -n -e "(branch:$(git branch | sed -e "/^ /d" -e "s/* \(.*\)/\1/"))"` $ '
    # PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt

这个 PS1 有两个功能: 一是高亮显示所有非0返回值, 如图所示; 二是在 Git 管理的目录下显示当前的 Git branch. 最近因为在做C语言课程设计, 用了 Git 来管理我的代码. 所以这个显示分支功能我太喜欢了. (虽然这个项目没有分支的必要..)

将上面的代码加入你的 ~/.bashrc 文件.

如果你使用 Emacs 的 Shell-mode, 那么你需要把 ANSI 彩色字符支持打开.

将下面的代码加入你的.emacs文件.

(ansi-color-for-comint-mode-on)

2. 一行语句的HTTP文件服务器

python -m SimpleHTTPServer

可以将当前目录设为一个在8000端口开放的http服务器的根目录. 在互联网中临时共享文件的时候是多么地方便阿!

徐宥说很多哥们还不知道 “wget -c” 能断点续传, 是这样么?

Linux Tricks (1) Read More »

我的Linux日记[五]: bash的小技巧

本文在署名-非商业性使用-相同方式共享 3.0版权协议下发布, 转载请注明出自aifreedom.com

  1. 我的Linux日记[一]: 让Ubuntu完全支持中文
  2. 我的Linux日记[二]: 重启后设备无法正常工作
  3. 我的Linux日记[三]: 系统为何无法启动
  4. 我的Linux日记[四]: 在Linux下播放多媒体文件
  5. 我的Linux日记[五]: bash的小技巧

bash是Ubuntu的默认终端, 也是大部分Linux发行版和Mac OS X的默认终端. 这篇日志记录了我在网上找到的和自己在使用中发现的一些使用技巧.

首先是一些快捷键
up & down 依次翻阅曾输入过的命令
ctrl + r 搜索曾输入过的命令, 但我不常用这个, 因为我有更方便的命令
ctrl + a 光标移动到行首
ctrl + e 光标移动到行尾, 这两个快捷键是Emacs风格的
ctrl + u 剪切光标之前的内容
ctrl + k 与上一个相反, 剪切光标之后的内容
ctrl + y 粘贴以上用以上两个快捷键剪切的内容
ctrl + w 删除光标左边的内容
ctrl + l 清屏, 和clear命令效果一样

我再来说说上面提到的更方便的搜索曾输入过的命令的方法. 在bash中输入过的命令都会保存在~/.bash_history里, 搜索这个文件就能搜索输入过的命令了. 在这里我们使用egrep这个支持正则表达式匹配的程序搜索.

cat ~/.bash_history | egrep REGEXP

这个命令可以显示匹配”REGEXP”的, 曾输入过的命令. 而如果使用ctrl + r搜索, 可能要按很多次ctrl + r才能找到需要的命令.

这个命令里包含了一个”|”符号, 这是在使用bash支持的”管道”功能. 管道, 就像是将程序输出的数据流装进了管子, 让它流向我们指定的地方(下一个程序). 比如这里, 我先将~/.bash_history的内容读取出来, 将它导入egrep, 让egrep用我输入的REGEXP来匹配这些数据. 再看一个用到管道功能的命令:

ls -l | more

“ls -l” 显示当前目录的文件和子文件夹的详细信息, “more” 可以让它分页显示. 是不是很方便?

bash里还有一个很有用的功能是”重定向”, 它可以重定向程序的标准输入输出和标准错误输出.

例如:

ls -l > ls.txt

和上一个命令差不多, 不过这次是把 “ls -l” 显示出的内容写入了 “ls.txt” 这个文件里. 如果把上面的 “>” 换成 “>>” , 就变成了把那些显示的内容添加到 “ls.txt” 的末尾, 而不是覆盖这个文件.

好了, 回到刚才说的那个搜索输入过的命令的命令(绕口令..). 我仍然嫌每次写这么长的命令太麻烦, 于是我编辑了一下”~/.bashrc”这个文件. 在它里面添加了

alias shis='cat ~/.bash_history | egrep'

这样一行. 之后我想使用上面的命令就只需要用”shis”这个命令加上我要搜索的正则表达式就好了.

上面提到的”~/.bashrc”文件帮了我很大的忙, 因为它是你打开bash时会被调用的一个文件. 在里面写上一些常用命令的缩写, 在调用的时候就方便很多. 我的”.bashrc”里有这些缩写, 一部分是系统自带了的, 一部分是我在网上看到的.

Bash语言: My .bashrc
# enable color support of ls and also add handy aliases
# 启用ls和grep等命令的自动高亮功能
if [ “$TERM” != “dumb” ] && [ -x /usr/bin/dircolors ]; then
eval “` dircolors -b`”
  alias ls=‘ ls –color=auto’
  alias dir=‘ ls –color=auto –format=vertical’
  alias vdir=‘ ls –color=auto –format=long’

  alias grep=‘ grep –color=auto’
  alias fgrep=‘ fgrep –color=auto’
  alias egrep=‘ egrep –color=auto’
fi

# some more ls aliases
# 很方便的, 而且很容易理解吧
alias ll=‘ls -l’
alias la=‘ls -A’
alias l=‘ls -CF’

# my aliases
alias rm=‘rm -i’ # 删除前需要确认, 防止误删
alias ..=‘cd ..’
alias server_name=‘ssh -v -l username server’ # 对常用ssh的人很有用, username和server请自己替换
alias shis=‘cat ~/.bash_history | egrep’ # 刚刚说过的

这里的代码高亮用到了代码发芽网的功能, 比WP的<code>强大, 但代码长度也要长些.

好了, 再额外提一个我知道的命令.

find . -perm /u+x -type f -exec rm {} \;

删除当前目录里所有的可执行文件. 在我清理存放我做题的文件夹时很有用, 因为我会编译一堆没有扩展名的可执行文件, 但删除时却也可以用一条命令全删除, 很好吧?

我的Linux日记[五]: bash的小技巧 Read More »