开源世界旅行手册:命令系统

Posted by Viletyy on 2019-12-29 10:28

命令系统

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用户才可以修改此文件。

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

urxvt配置 ~/.Xresources

1
2
3
4
5
6
7
8
9
10
11
12
13
14
!!=============================================================================
!! RXVT-unicode setting
!!=============================================================================
!设置字体分辨率
Xft.dpi:96
!设置字体
URxvt.font:-misc-fixed-medium-r-normal--14-*-*-*-*-*-iso10646-1,xft:WenQuanYi Bitmap Song:size=10 
!颜色
Rxvt.background:black
Rxvt.foreground:white
Rxvt.colorBD:yellow
Rxvt.colorUL:green
!滚动条
Rxvt.scrollBar:Trues

帮助系统

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

1
man xxx

bash

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

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

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

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

1
http://linuxtoy.org/xxx.mp3

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

1
wget http://linuxtoy.org/xxx.mp3

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

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

您还可以使用ctrl+f向前移动光标,ctrl+b向后移动光标,ctrl+e将光标移动到行末。

中止正在运行的程序

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

ctrl+s

有时您会不小心按下ctrl+s这个组合键,shell便会冻结。尝试使用ctrl+q组合键,看能否恢复正常。

键绑定

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

我们强烈建议您记住,以大幅度的提高操作效率。而且这是readline控件的键绑定,在任何使用readline控件的程序中,您都可以使用它们。例如bash、lftp、gdb等程序,同时,linux下倍受追捧的Emacs编辑器,也是这种风格的键绑定(其实是readline使用了Emacs风格的键绑定才对),甚至firefox中,也可以使用类似风格的快捷键!(linux下主要有两种风格的键绑定,一种是Emacs风格,另一种是vi风格。

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

先来了解一些约定:

  • \C-a表示ctrl+a
  • \M-a表示meta+a,meta键在PC中通常为alt键。

image-20210626210446827

自动补全

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

自定义键绑定

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

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

1
set editing-mode vi

找到这一行:

1
$if mode=emacs

在它的下面添加如下内容

1
2
3
4
5
"\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遍历补全,将所有可能的选项轮流放入命令行。

通配符

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

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

您可以将便利补全和通配符结合使用,以提高效率。例如

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

任务管理

  • &:在命令的末尾加上一个&符号,表示背景任务,例如
1
wget http://www.download.net/xxx/mp3 &
  • ;: 使用 ; 将多个命令连结起来,则表示任务按顺序执行
  • &&: 使用 && 将多个命令连结起来,则表示只有前面的命令执行成功,后面的命令才能得以执行
  • `` : 如果一个 命令中包含以 `` (Esc下方的按键) 括起来的子命令,那么子命令将被优先执行,执行结果被代入上一级命令继续执行,例如创建一个以当前时间命名的文件:
1
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
[1]+  Stopped   xxx
  • bg: 将挂起的任务背景运行。这时它的状态为
1
[1]+ xxx &	
  • fg: 将背景任务调到前台执行

  • jobs: 查看背景任务,方括号中的数字为命令的任务编号如果后台运行多个任务,您可以在 bg 或者 fg 后跟任务编号,作为操作对象,例如:

1
bg 2

管道、重定向

  • >: 重定向符号,它的作用是将命令的输出重定向到一个文件中。比如我们想把命令ls的结果保存为FileList文件,作为一个清单,我们可以使用重定向符号来完成它:
1
ls -l > FileList
  • >>:作用与>基本相同,不同点在于,>>以追加的方式,将命令的输出写入文件的末尾。
  • <: 是从文件到命令的重定向,将文件的内容作为命令的输入。
  • |:为管道符号,它的作用是将前一个命令的输出,作为下一个命令的输入。假设一个目录下的文件太多,使用ls命令不能够在屏幕中完全显示,这个时候您可以将ls命令的输出,通过管道符号,作为浏览器less的输入。就可以使用浏览器的功能翻页、查找:
1
ls -la | less

脱字符

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

1
less ;xxx

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

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

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

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

1
2
3
less \;xxx
less \ \xxx
less \;\ \&\xxx

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

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

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

设置您的默认Shell

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

1
user①:x②:1000③:112④:user⑤,,,:/home/user⑥:/bin/bash⑦

①用户登录名

②用户口令(通常转储在/etc/shadow文件中)

③用户UID

④用户GID

⑤用户信息

⑥用户$HOME目录位置

⑦为用户登录后的默认shell,/bin/bash是程序bash的主程序路径。zsh主程序的路径通常为/bin/zsh

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

也可以通过以下命令设置您的默认shell

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

设定命令的搜索路径

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

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

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

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

例如:

1
2
/usr/local/mplayer -menu xxx.rmvb
cd /usr/local/ && ./mplayer -menu xxx.rmvb

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

1
PATH:"$PATH:/user/"

在双引号中添加您的自定义路径,并以:分隔。

参考资料: