Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8315146
  • 博文数量: 1413
  • 博客积分: 11128
  • 博客等级: 上将
  • 技术积分: 14685
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-13 10:03
个人简介

follow my heart...

文章分类

全部博文(1413)

文章存档

2013年(1)

2012年(5)

2011年(45)

2010年(176)

2009年(148)

2008年(190)

2007年(293)

2006年(555)

分类: LINUX

2007-07-11 11:23:46

命令行

Shell、Console、Terminal

    在前面的章节中,我们曾提到,电视机的遥控器,也是一种人机交互的界面,算是一种Shell。

    但是这个概念并不准确,遥控器只是向Shell发送指令的工具,Shell接收到遥控器发出指令后,将指令转换为系统命令,由系统来执行。

    例如我们按的遥控器上的 数字键1 ,遥控器将 切换为1频道 的指令发送到Shell,Shell将指令转换为系统可以识别的 频道1 ,系统执行它,您就可以观看1频道的电视节目了。


    通常每台电视机只有一种Shell,比如有的电视机系统具有“画中画”的功能,那么Shell中便有相应的功能定义,您可以通过遥控器上的“画中画”功能键来开启它。假设您的电视机没有此功能,Shell中也就没有相应的功能定义。拥有一个带“画中画”功能控制键的遥控器,即便信号兼容,您还是不能够使用这一功能:)

    不用遥控器也可以控制电视机,假设您的遥控器丢了,您还可以走到电视机前,使用机身上的控制面板来控制它(相当于使用Linux的控制台)。但是您一定不喜欢这种方式,除非您想锻炼身体:)

    在Linux系统中,由于图形界面和控制台的分辨率通常不一致,所以切换时要有一个延时。对于我们中文用户来讲,控制台下中文的显示也比较麻烦。而且控制台显示内容通常不如终端显示的全面。

    所以我们推荐您使用终端来执行命令,它使用起来感觉很像遥控器:)

rxvt-unicode

    通常情况下,您买一台电视机,只能获得一个遥控器。虽然它为您的电视机量身定作,能够最大限度发挥电视机的能力,但您却不一定喜欢它。说不定这个遥控器体形太大,持握不方便;或者它体形太小,容易失踪;又或者它的按键要么太硬,要么太软;它的键盘要么太大,要么太小……

    您一般也可以容忍,毕竟遥控器使用频率并不算高:)

    如果您的终端有些地方不讨您喜欢,比如说响应太慢,或者不能正常显示中文……那就难以忍受了,您应该换一个其它的试试。

    在前面的章节,我们介绍您使用的终端为Gnome-Termianl,它是系统默认使用的终端,显示中文不错,不过响应比较慢,您可能已经处于水深火热之中了。。。


    我们推荐您使用urxvt(mlterm也是不错的选择)

    您可以使用 sudo apt-get install rxvt-unicode 命令来安装它。

    urxvt 启动它 (urxvt不支持控制台,您得在图形界面下启动它。终端、Alt+F2,建议您在启动栏里新建一个启动图标)

    rxvt-unicode还支持“服务器/客户端”的运行模式:

        urxvtd 启动一个守护进程daemon(支持控制台)
        urxvtc 启动客户端client。多个客户端可以同时连接到一个urxvtd,以达到节省系统资源的目的。

    或许您对rxvt的默认设置不满意,您可以修改用户配置文件 ~/.Xresources 来设定它。修改全局配置文件 /etc/X11/Xresources/Xresources ,则对所有用户生效,只有root才可以修改此文件。

    这里有一些简单的选项:(以 ! 起始的行是注释,您可以直接拷贝此文件的内容)

    !!=============================================================================
    !! RXVT-unicode setting
    !!=============================================================================
    !设置字体分辨率
    Xft.dpi:96
    !窗口大小
    Rxvt.geometry: 80x40+80+80
    !颜色
    Rxvt.background:#333333
    Rxvt.foreground:antiquewhite
    Rxvt.inheritPixmap:False
    Rxvt.colorBD:yellow
    Rxvt.colorUL:antiquewhite
    !滚动条
    Rxvt.scrollBar:True
    Rxvt.scrollBar_left:True
    Rxvt.scrollBar_floating:False
    Rxvt.scrollstyle:next
    Rxvt.scrollColor:#999999
    !屏幕缓冲
    Rxvt.saveLines:30000
    Rxvt.color12odgerBlue
    Rxvt.font:7x14,xft:AR PL New Sung
    !输入法一般设置为xim
    !inputMethod:xim;Scim除外
    !输入法样式可选:Root(置底) OverTheSpot(跟随) OffTheSpot OnTheSpot,后两种不是所有的都支持
    Rxvt.preeditType:Root

    Tip:右键点击启动栏, 添加自启动器 , 自定义程序 ,便可以在添加自己的启动图标。

在线帮助系统

    您可以使用命令 man 或者 info 来阅读Linux命令的在线文档。命令的格式非常简单:

    man xxx

    大部分命令手册为英文版,如果您的英文不太好,或许有些困难。在后面的 系统管理 章节中,我们会尽力向您介绍命令的使用方法。


    Tip:在使用“man”浏览器的时候,一些快捷键您可能会用到:

    Ctrl+f(orward)  向下翻一页        Ctrl+d(own)     向下翻半页
    Ctrl+b(ackward) 向上翻一页        Ctrl+u(p)       向上翻半页
    /               查找             q(uit)          退出

    以上为VI风格的键绑定。您也可以使用Emacs风格的键绑定

bash

    好了,现在我们换了一个遥控器,感觉顺手多了。现在来操练一下,下载一首mp3:

    我们使用 wget 这个程序,它非常可靠,完全值得您信赖。

    首先找到一个可以下载的地址,复制链接,在终端窗口内点击鼠标中键,把它粘贴进去。

    现在终端中大概是这种情形:

   

    按下 Ctrl+a 组合键,我们发现光标移动到了行首。输入 wget 和 空格

    wget

    回车后,终端中出现一些信息,不一会儿工夫,mp3便下载完成。


    使用 Ctrl+a 组合键,我们就不需要使用方向键来移动光标,方向键每次只能移动一个字符,没有效率

    您还可以使用 Ctrl+f 向前移动光标, Ctrl+b 向后移动光标, Ctrl+e 将光标移动到行末……………… (键绑定)

    Note

    Linux的图形界面中,鼠标中键通常执行“粘贴”的操作,如果您的鼠标没有中键,您可以左右键同时按下。

中止正在运行的程序

    如果一个命令持续时间很长,以致于不能够进行其它操作,可以使用 Ctrl+c 来强行中止它。

Ctrl+s

    出于意外,有时您会按下 Ctrl+s 这个组合键,Shell便被冻结。尝试使用 Ctrl+q 组合键,看能否恢复正常。

键绑定

    等等,有必要记这么多快捷键么?都这么复杂!

    我们强烈建议您记住,以大幅度的提高操作效率。而且这是readline控件的键绑定,在任何使用readline控件的程序中,您都可以使用它们。例如bash、lftp、gdb等程序;同时,Linux下最著名的Emacs编辑器,也是这种风格的键绑定(其实是readline使用了 Emacs风格的键绑定才对),甚至FireFox中,也可以使用类似风格的快捷键!(Linux下主要有两种风格的键绑定,一种是VI风格,另一种是 Emacs风格,我们会在 简明VIM教程中介绍)

    现在列举一些ReadLine的键绑定,您可以自行尝试。(运行 man readline 命令,来查看ReadLine手册)

    先来了解一些约定:

    \C-a 表示 Ctrl+a
    \M-a 表示 Meta+a  Meta键在PC中通常为ALT键
    A    表示 Shift+a
    (下面括号中的\A代表Alt,\S代表Shift)

    移动命令:

    \C-a    移动到行首        Aheah
    \C-e    移动到行末        End
    \C-f    向前移动一个字符   Forward
    \C-b    向后移动一个字符   Backward
    \M-f    向前移动一个单词
    \M-b    向后移动一个单词
    \C-l    清空屏幕           cLear

    这两个命令也可以理解为移动命令

    \C-p    上翻,前一条命令    Previous
    \C-n    下翻,后一条命令    Next

    编辑命令:

    \C-d       删除光标后的一个字符    \M-d         删除光标后的一个单词    Delete
    \BackSpace 删除光标前的一个字符    \M-BackSpace 删除光标前的一个单词
    \C-k       删除光标至行末的部分                                 Kill
    \C-u       删除光标至行首的部分                                 Unix-line-discard
    \C-w       删除光标前的一个单词                                 Word
    \C-y       粘贴(最后删除的对象)                                 Yank
    \C--       撤消

    搜索历史纪录:

    \C-r    连续使用 ``C-r`` 可以查找下一个
    \M-p
    \M-n

    补全:

    \Tab    使用频率最高的功能!
    \C-o    遍历补全 (未定义)
    \M-?    M-=     列出所有可能选项,相当于按两次Tab键(M-? 实际按键为\A+\S+/)
    \M-#    注释掉当前命令,用于将当前命令暂存于历史纪录列表(\A+\S+3)
    \M-!    补全命令,通常用来补全子命令,例如 ``sudo`` 的子命令(\A+\S+1)
    \M-~    补全用户名(\A+\S+`)
    \M-@    补全主机名(\A+\S+2)
    \M-$    补全变量(\A+\S+4)
    \M-_    补全历史纪录中的纪录(\A+\S+-)
    \M-*    将所有可能选项放到命令行中(\A+\S+8)

自定义键绑定

    通过修改 /etc/inputrc 文件,可以更改键绑定。建议您使用默认的键绑定,以避免不必要的烦恼。当然了,Emacs风格的键绑定是通用的,随时都有可能用到。

    在文件中添加该行,可以将ReadLine的键绑定设为VI风格。(Bash、Lftp等使用ReadLine的软件同时生效)

    set editing-mode vi


    找到这一行:

    $if mode=emacs

    在它的下面添加如下内容

    "\C-o": menu-complete

    ###这两行不是必须的,视情况而定###
    "\c-p": non-incremental-reverse-search-history
    "\c-n": non-incremental-forward-search-history

    重新登录Shell,您就可以使用 \C-o (Ctrl+o)来遍历补全。假如您的文件名为中文,或者出现乱码时,您可以使用 \M-* 将所有文件名放入命令行,再删除多余的,这真是麻烦极了!所以您可以使用 \C-o 遍历补全,将所有可能的选项轮流放入命令行。

    或者使用Vim编辑器编辑 /etc/inputrc 文件,在插入模式下使用 Ctrl+v 组合键。按下 Ctrl+o ,这时编辑区新增一个 ^O 字符,等价于 \C-o

通配符

    使用 ? 代表任意单个字符。例如 ???lo ,表示 lo 前有三个字符,它可以匹配 Hello

    使用 * 代表随意几个任意字符。例如 *.iso ,代表所有iso格式的文件。

    Tip:您可以将遍历补全和通配符结合使用,以提高效率。

    例如:

    cd */   则遍历补全只补全文件夹
    chmview *.chm 则遍历补全只补全chm文件

任务管理

    &

        在命令的末尾加上一个 & 符号,表示背景任务,例如:

        wget &

    ;
        使用 ; 将多个命令连结起来,则表示任务按顺序执行
    &&
        使用 && 将多个命令连结起来,则表示只有前面的命令执行成功,后面的命令才能得以执行
    ``

        `<命令>` ,如果一个命令中包含以 `` (Esc键下方的按键)括起来的子命令,那么子命令将被优先执行,执行结果被代入上一级命令继续执行,例如创建一个以当前时间命名的文件:

        touch `date +%m.%d_%H:%M:%S`

        touch 命令能够创建一个文件,它的操作对象,为 date +%m%d%H%M%S 命令的输出 06.06_06:06:60

        这样,我们创建了一个名为 06.06_06:06:60 的文件(六月六日六时六分刚过六十秒-_-!)
    Ctrl+z

        将当前Shell中的任务挂起

        这个时候任务的状态为

        [1]+  Stopped   xxx

    bg

        将挂起的任务背景运行。这时它的状态为

        [1]+ xxx &

    fg
        将背景任务调到前台执行
    jobs
        方括号中的数字为命令的任务编号,您可以使用 jobs 命令来查看所有背景任务

    如果后台运行多个任务,您可以在 bg 或者 fg 后跟任务编号,作为操作对象,例如:

    bg 2

管道、重定向

    >

        重定向符号,它的作用是将命令的输出重定向到一个文件中。比如我们想把命令 ls 的结果保存为 FileList 文件,作一个清单,我们可以使用重定向符号来完成它:

        ls -l > FileList

    >>
        作用与 > 基本相同,不同点在于, >> 以追加的方式,将命令的输出写入文件的末尾。
    <
        是从文件到命令的重定向,将文件的内容作为命令的输入。
    |

        为管道符号,它的作用是将前一个命令的输出,作为下一个命令的输入。假设一个目录下的文件太多,使用 ls 命令不能够在屏幕中完全显示,这个时候您可以将 ls 命令的输出,通过管道符号,作为浏览器 less 的输入。就可以使用浏览器的功能翻页、查找:

        ls -al | less

        Tip: less 浏览器的键绑定几乎与 man 相同,请参阅 在线帮助系统

脱字符

    Shell中的一些功能是通过特殊符号作为控制字符来实现的,上面已经介绍了很多了。这产生一个问题,如果一个文件名中,刚好包含了这些字符,比如 ; ,就很难对它进行操作。使用 less 浏览这个文件

    less ;xxx

    less 会很快返回一个错误信息,因为并没有一个文件名作为操作对象。接着,Shell会报告,系统中没有 xxx 这个命令。

    这是因为Shell将文件名中的 ; 解析为按顺序执行命令。

    或者您的文件名以空白起始,而在Shell中,无论多少个空格,都将被解析为一个分隔符。您甚至不是使用命令重命名此文件。

    这个时候就要用到脱字符 \ 了,它能够将一个具有特殊涵义的字符转换普通字符。上面的两个任务,可以在文件名中每个特殊字符前加一个 \ ,像这样

    less \;xxx
    less \ \xxx
    less \;\ \&\xxx

    Tip

    也可以使用 " 将文件名括起来,例如 less "; &xxx" ,在很多情况下,这样甚至更方便。

    脱字符在Shell中也可以作为换行符,在一个命令的末尾添加一个 \ ,然后回车,在下一行继续输入命令剩余的部分,将一个命令拆分为多行且不影响它的执行(如果执行一个很长的命令,请将它拆分为多行以便于阅读)

    事实上换行符也符合脱字符的定义。回车键有两个涵义,一个是 执行 (Enter),另一个 换行 (折线箭头)。在Shell中它作为控制字符 执行 ,使用脱字符后,它便代表排版字符 换行 了。

Fish

    the friendly interactive shell

    正如它的名字,Fish是一款非常友好的Shell,大力推荐!使用命令 sudo apt-get install fish 安装它。完成后,运行命令 fish 切换到fish, exit 返回bash。

    简单介绍一下它的优点:

           1.

              自动补全、语法高亮

              bash的自动补全默认只是补全命令、路径,如果想补全变量、参数等,通常需要使用复杂的组合键(见上面bash的介绍),即便您能够记住它们,快速准确的按下这些组合键,也是一种严峻的考验。而FISH的自动补全可以自动识别语法,补全正确的内容。并且具有语法高亮的功能,比如用MPLAYER放 MP3:

              mpl(ayer) -l(oop) (0) -sh(uffle) -pl(aylist) (mp3_playlist)

              一阵猛按 键,一个蛮长的命令就完成了。

              补全结果不唯一时给出的提示中含有简短的说明,这样通常也不用看帮助了:)比如:

              mplayer -l

               后,自动将参数补全为 -lo 然后给出提示

              -{lo}adidx (Load index from file) -{lo}op (Loop playback) {花括号中为青色文字}

              它的语法高亮功能十分有用,如果你输入的命令是正确的,则用青色显示,正确的参数用白色显示,错误的则一律用红色。
           2.

              方便的历史纪录搜索

              还是上面的那个命令

              mplayer -loop 0 -shuffle -playlist mp3_playlist

              用上翻配合下翻浏览命令历史,直到找到这个命令,当然那样太慢了。

              还可以输入以上命令中的某一部分,如 uffle 只要翻一次就可以找到了

              (还可以META+上翻在已输入部分中插入某一历史单词)
           3.

              文件夹历史纪录

              dirh (dir history)就可以显示当前会话中进入的文件夹纪录

              使用 prevd 和 nextd 跳转

              假如曾进入过1 2 3 4 5 这几个文件夹, prevd 4 可以让你在 5 中直接跳到 1
           4.

              其它的功能,fish基本是兼容bash的。键绑定也非常的相似,少数的键绑定不尽一致,例如:

              \C-h    删除光标前的一个字符(bash为退格键,不方便)

              修改 /etc/fish_inputrc 这个文件,增加以下行:

              "\C-n": history-search-forward
              "\C-p": history-search-backward

              现在使用Ctrl+p上翻,使用Ctrl+n下翻。如果已经在命令行中输入字符,那么Ctrl+p就是在历史纪录向上查找您输入的字符,Ctrl+n为向下查找,非常的方便。

设定您的默认Shell

    如果能够拥有root权限,可以直接修改 /etc/passwd 文件。找到您用户ID起始的行

    user:x:1000:112:user,,,:/home/user:/bin/bash

    最后一个字段为登录后的默认Shell, /bin/bash 是程序 bash 的主程序路径。 fish 主程序的路径通常为 /usr/bin/fish 。

    /etc/shells 中列出系统中所有可用Shell( /bin/false 代表禁用Shell)


    也可以使用如下命令更改您的默认Shell

    chsh -s /usr/bin/fish
    (需要输入您的密码)

    Tip:可以使用 whereis xxx 命令,来查找 xxx 程序的安装位置,详见 搜索

设定命令的搜索路径

    使用 echo $PATH ,可以显示 $PATH 变量,输出如下:

    /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/bin/X11 /usr/games /usr/X11R6/bin

    它是一个环境变量,代表执行命令时,Shell的搜索路径。

    执行一个命令时,Shell会到 $PATH 变量定义的路径去搜索,并运行与命令同名的可执行文件。如果程序、脚本等可执行文件并不在上面的路径中,就必须使用绝对路径或者相对路径定位可执行文件。

    例如:

    /usr/local/mplayer -menu xxx.rmvb
    /etc/init.d/powernowd start
    cd /usr/local/   &&  ./mplayer -menu xxx.rmvb

    可以修改 /etc/environment 文件来设定您的命令搜索路径,找到 PATH 起始的行

    PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin"

    在双引号中添加您的自定义路径,并以 : 分隔。
阅读(1923) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~