• 原文:CLI Magic: command not found, suggest what to apt-get
    作者:mysurface
    译者:gosman(lianmingchang2008#gmail.com)
    来自:http://gosman.blogbus.com
    版本:V 1.1.0
    时间:2007-9-7

    最近我从 Ubuntu Edgy 升级到 Ubuntu Feisty,发现 Feisty 一个有趣的程序 command-not-found。当你输入系统中不存在的命令时,该程序就会提示包含该命令的安装包并提示用 apt-get 安装。

    以未安装的命令 trafshow 为例,输出为:

    The program 'trafshow' is currently not installed. You can install it by typing:
    sudo apt-get install netdiag
    Make sure you have the 'universe' component enabled
    bash: trafshow:找不到命令
    

    如果不行的话,请去掉 /etc/bash.bashrc 中以下语句的注释:

    # if the command-not-found package is installed, use it
    if [ -x /usr/bin/command-not-found ]; then
    function command_not_found_handle {
    /usr/bin/command-not-found $1
    return $?
    }
    fi
    

    command-not-found 命令是能返回提示语句的 Python 脚本。因此只要输入command-not-found <command name>就会输出提示语句,不管该命令安装与否。

    command-not-found gedit
    The program 'gedit' is currently not installed. You can install it by typing:
    sudo apt-get install gedit
    

    我们可以用 command-not-found 查找包含特定命令的安装包,与可以完成同样操作的dpkg -S相比,command-not-found查询更迅速。

    还可以在 bash 脚本中使用 command-not-found 命令。看下面这个简单脚本:

    #!/bin/bash
    Cmd=`which trafshow`;
    if [ -n $Cmd ]
    then
    command-not-found trafshow
    fi
    

    以上脚本查找 trafshow 的绝对路径,如果 tarfshow 没有安装,变量 Cmd 是个空值(null)就会返回 command-not-found 的提示语句。这样做的原因是在 bash 脚本中不会自动使用 command-not-found 特性。我的意思是在 bash 脚本中使用未安装的命令,不会输出 command-not-found 的提示语句。

    我不知道除了 Ubuntu Feisty 在别的发行版本中是否有 command-not-found,从Agile Testing那里知道可以在 Ubuntu Edgy中用 apt-get 安装 command-not-found。

    command-not-found 特性会减慢命令行的处理,因为每次输入未安装的命令时就会执行查找工作。Niath对 command-not-found 执行时间进行测试,结果是我们能接受的。

  • 原文:CLI magic: programable bash completion
    作者:mysurface
    译者:gosman(lianmingchang2008#gmail.com)
    来自:http://gosman.blogbus.com/
    版本:V 1.0.0
    时间:2007-5-5

    Ubuntu 以简单、友好的用户界面变的越来越流行。少量的单击就可以安装任何程序,在图形界面下完成配置等简便的操作。人们经常有这样的想法:也许有一天Ubuntu会成为像微软Windows 那样流行的操作系统。

    不可能!通过图形用户界面使操作变得简单这个想法就是错误的。Ubuntu Feisty 集成大量的图形界面程序来减轻诸如网络、无线接入、VPN、多媒体解码等配置工作,同时也集成一些神奇的命令行特性,其中之一就是bash补全功能。

    我们可能都有过按Tab键两次来使用方便的bash补全功能的经历。例如,当输入部分命令时按Tab键两次就会显示一个可用命令列表。例如输入:

    svn [tab][tab]
    

    将会列出以下命令:

    svn svnadmin svndiff svndumpfilter svnlook svnpath svnserve svnsync svnversion
    

    可编程的bash补全有什么特别呢?

    如果bash补全也适用于 apt-get、svn、help 这类命令呢?

    在用一个命令前我们经常要用 --help 或 -h 来查看该命令提供的选项。命令选项也能自动补全吗?

    让我们看看 svn 命令:

    svn c[tab][tab]
    cat checkout ci cleanup co commit copy cp
    

    这就是说你可以使用 svn cat、svn checkout、svn ci 等。

    并不是只有选项才有自动补全,它是可编程的,实际上你可以将特定功能(function)和特定命令绑定(write a function and bind it with a command)。以 apt-get 为例,通常列出以特定字符开头的安装包,比如'can---',我们可以:

    apt-cache pkgnames can
    

    但现在只需:

    apt-get install can[tab][tab]
    

    很酷不是吗?

    另外一个例子,bash补全可以和某些文件格式和扩展名绑定.比如有一个名为 download 的目录用来存放 .tar.gz、.zip、.rar等存档文件。当你输入:

    tar zxvf [tab][tab]
    

    将只列出扩展名为.tar.gz的所有文件。

    安装

    一些Linux发行版已经默认安装,只需去掉在/etc/bash.bashrc中以下内容的注释来打开这项功能。

    # enable bash completion in interactive shells
    if [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
    fi
    

    基于Debian的发行版可以用apt-get安装:

    apt-get install bash-completion
    

    需要源代码和手动安装?http://www.caliban.org/bash/

    想知道哪些命令具有自动补全功能?

    complete | sort -o complete.txt
    

    以上命令把所有具有bash补全功能的命令的信息输出到文件 complete.txt 中。我们用'complete'这个bash命令来定义bash补全功能。complete.txt 列出所有的complete命令行,这看起来有点复杂:

    ...
    complete -F _wvdial wvdial
    complete -g groupdel
    complete -g groupmod
    complete -g newgrp
    complete -j -P '%' disown
    complete -j -P '%' fg
    complete -j -P '%' jobs
    complete -o default -F _aptitude aptitude
    complete -o default -F _aspell aspell
    complete -o default -F _configure_func configure
    complete -o default -F _cvs cvs
    complete -o default -F _dpkg_reconfigure dpkg-reconfigure
    complete -o default -F _gpg gpg
    complete -o default -F _iconv iconv
    complete -o default -F _lftp lftp
    complete -o default -F _longopt env
    complete -o default -F _longopt netstat
    complete -o default -F _longopt seq
    complete -o default -F _longopt uname
    complete -o default -F _longopt units
    complete -o default -F _longopt wget
    complete -o default -F _look look
    ...
    

    也许你不明白 -F -o 的意义,但可以从每行的最后几个单词知道哪些命令具有bash补全功能。例如wvdail、groupdel、units、wget有 bash 补全功能。

    哪里有为自己的程序增加 bash 补全功能的参考信息?

    Bash 的帮助文档(man)和bash在线参考.如果你只是想知道complete命令选项的意义和用法,可以参考Programmable Completion Builtins.

    实际上定义所有功能(function)的代码都在 /etc/bash_completion 中。

    其他有关bash补全的文章

  • 单位换算 - [LBE]

    2007-05-03

    原文:units of measurement
    作者:mysurface
    译者:gosman(lianmingchang2008#gmail.com)
    来自:http://gosman.blogbus.com
    版本:V 1.0.0
    时间:2007-5-3

    为了测量物体,我们需要使用某种单位制。我们用英寸、厘米、米来度量一张纸的长度或宽度。有些单位制之间的互换并不是简单的换算。例如英寸和厘米的近似转换:1英寸=2.54厘米,1厘米=0.3937英寸。

    units 命令可以完成单位换算,如把2.25英寸换成厘米:

    units 2.25inch cm
    

    结果是:

    * 5.715
    / 0.17497813
    

    第一行是我们期望的结果。第二行是逆变换,就是说2.25*0.17497183英寸大约为1厘米,可以用 bc 验证:

    echo "2.25*0.17497813" | bc -l
    

    利用命令headcut和管道可以只输出换算结果:

    units 2.25inch cm | head -n1 | cut -f2 -d' '
    

    另外我发现一个很酷的在线单位制转换工具:WWW Unit Converter

  • wget批量下载 - [LBE]

    2007-04-29

    原文:Performs a batch download using wget
    作者:mysurface
    译者:gosman(lianmingchang2008#gmail.com)
    来自:http://gosman.blogbus.com
    版本:V 1.0.0
    时间:2007-4-29

    如果要下载某个站点的某个目录下的所有文件,这需要较长的wget命令:

    wget -nd -r -l1 --no-parent http://www.foo.com/mp3/
    

    通常这样是可行的,但同时也会下载一些类似 index.@xx 这样没用的文件。想让你的目录干净些,如果你知道文件名格式的话,你可以用以下命令:

    wget -nd -r -l1 --no-parent -A.mp3 -A.wma http://www.foo.com/mp3
    

    简单解释一下以上选项的意义:
    -nd 不创建目录(no directory), wget缺省创建目录
    -r 递归下载
    -l1 深度1(level 1),只下载指定目录,不下载下层目录
    --no-parent 不追溯到起源目录(I definately don’t want the parent’s files)

  • 原文:wget, a powerful downloader
    作者:mysurface
    译者:gosman(lianmingchang2008#gmail.com)
    来自:http://gosman.blogbus.com
    版本:V 1.0.0
    时间:2007-4-29

    如果你认为wget只是基于命令行的下载器,那你就错了。wget拥有各种各样的下载功能。下面就展示几个小例子:

    从站点下载文件:

    wget http://www.dummy.com/foo.tar.gz
    

    实现断点续传:

    wget -c http://www.dummy.com/foo.tar.gz
    

    好的,我的网络连接比较慢,经常断线,想让它自动重连并继续下载,该怎么办呢?

    wget -t -0 -c http://www.dummy.com/foo.tar.gz #默认重试20次,选项 -t 0 使它一直重试。
    

    挺有意思的,那我想下载已知网址的整个站点该怎么办呢?

    wget -p http://www.dummy.com/blog
    

    如果我下载的文件需要用户名和密码该怎么办呢?

    wget http://www.dummy.com/bar.tar --user=name --password=passwd
    

    想知道更多,那就man wget吧!