gitstats/_posts/2019-12-29-linux-guide-comm...

329 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
layout: post
title: "开源世界旅行手册:命令系统"
date: 2019-12-29 10:28:00
author: "Viletyy"
header-style: text
tags:
- Linux
---
## 命令系统
### Shell、Console、Terminal
在前面的章节中我们曾提到电视机的遥控器也是一种人机交互的界面算是一种Shell。
但是这个概念并不准确遥控器只是向Shell发送指令的工具Shell受到遥控器发出指令后将指令转换为系统命令由系统来执行。
例如我们按的遥控器上的数字键1遥控器将切换为1频道的指令发送到ShellShell将指令转换为系统可以识别的频道1系统执行它您就可以观看1频道的电视节目了。
通常每台电视机只有一种Shell比如有的电视机系统具有“画中画”的功能那么Shell中便有相应的功能定义您可以通过遥控器上的“画中画”功能键来开启它。假设您的电视机没有此功能Shell中也就没有相应的功能定义。拥有一个带“画中画”功能控制键的遥控器即便信号兼容您还是不能够使用这一功能。
不用遥控器也可以控制电视机假设您的遥控器丢了您还可以走到电视机前使用机身上的控制面板来控制它相当于使用Linux的控制台。但是您一定不喜欢这种方式除非您想锻炼身体。
在Linux系统中由于图形界面和控制台的分辨率通常不一致所以切换时要有一个延时。对于我们中文用户来讲控制台下中文的显示也比较麻烦。而且控制台显示内容通常不如终端显示的全面。
所以我们推荐您使用终端来执行命令,它使用起来感觉很像遥控器。
### rxvt-unicode
通常情况下,您买一台电视机,只能获得一个遥控器。虽然它为您的电视机量身定制,能够最大限度发挥电视机的能力,但您却不一定喜欢它。说不定这个遥控器体形太大,持握不方便;或者它体形太小,容易失踪;又或者它的按键要么太硬,要么太软;它的键盘要么太大,要么太小。。。
您一般也可以容忍,毕竟遥控器使用频率不算高
如果您的终端有些地方不讨您喜欢,比如响应太慢,或者不能正常显示中文。。。那就难以忍受了,您应该换一个其他的试试。
您所接触的第一个终端极有可能是Gnome-Termianl它是系统默认使用的终端显示中文不错不过响应比较慢。
我们推荐您使用urxvtmlterm也是不错的选择
您可以使用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
```shell
!!=============================================================================
!! 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命令的在线文档。命令的格式非常简单
```shell
man xxx
```
### bash
好了现在我们换了一个遥控器感觉顺手多了。现在来操练一下。下载一首mp3
我们使用wget这个程序它非常可靠完全值得您信赖.
首先找到一个可以下载的地址,复制链接,在终端窗口内点击鼠标中键,把它粘贴进去。
现在终端中大概是这种情形:
```shell
http://linuxtoy.org/xxx.mp3
```
按下`ctrl+a`组合键,我们发现光标移动道了行首。输入`wget`和`空格`
```shell
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](/img/in-post/2019-12-29-linux-guide-command-system-01.png)
自动补全
| 命令 | 含义 | 按键 |
| ---- | ------------------------------------------------ | ----------- |
| 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的软件同时生效
```shell
set editing-mode vi
```
找到这一行:
```shell
$if mode=emacs
```
在它的下面添加如下内容
```shell
"\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格式的文件。
您可以将便利补全和通配符结合使用,以提高效率。例如
```shell
cd */ 则遍历补全只补全文件夹
chmview *.chm 则遍历补全只补全chm文件
```
#### 任务管理
- `&`:在命令的末尾加上一个&符号,表示背景任务,例如
```shell
wget http://www.download.net/xxx/mp3 &
```
- `;`: 使用 ; 将多个命令连结起来,则表示任务按顺序执行
- `&&`: 使用 && 将多个命令连结起来,则表示只有前面的命令执行成功,后面的命令才能得以执行
- \`\` : 如果一个 命令中包含以 \`\` (Esc下方的按键) 括起来的子命令,那么子命令将被优先执行,执行结果被代入上一级命令继续执行,例如创建一个以当前时间命名的文件:
```shell
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 中的任务挂起,这个时候任务的状态为
```shell
[1]+ Stopped xxx
```
- `bg`: 将挂起的任务背景运行。这时它的状态为
```shell
[1]+ xxx &
```
- `fg`: 将背景任务调到前台执行
- `jobs`: 查看背景任务,方括号中的数字为命令的任务编号如果后台运行多个任务,您可以在 bg 或者 fg 后跟任务编号,作为操作对象,例如:
```shell
bg 2
```
#### 管道、重定向
- `>`: 重定向符号,它的作用是将命令的输出重定向到一个文件中。比如我们想把命令`ls`的结果保存为FileList文件作为一个清单我们可以使用重定向符号来完成它
```shell
ls -l > FileList
```
- `>>`:作用与`>`基本相同,不同点在于,`>>`以追加的方式,将命令的输出写入文件的末尾。
- `<`: 是从文件到命令的重定向,将文件的内容作为命令的输入。
- `|`:为管道符号,它的作用是将前一个命令的输出,作为下一个命令的输入。假设一个目录下的文件太多,使用`ls`命令不能够在屏幕中完全显示,这个时候您可以将`ls`命令的输出通过管道符号作为浏览器less的输入。就可以使用浏览器的功能翻页、查找
```shell
ls -la | less
```
#### 脱字符
Shell中的一些功能是通过特殊符号作为控制符号来实现的。上面已经介绍了很多了。这产生一个问题如果一个文件名中刚好包含了这些字符比如`;`就很难对它进行操作。使用less浏览这个文件
```shell
less ;xxx
```
less会很快返回一个错误信息因为并没有一个文件名作为操作对象。接着shell会报告系统中没有`xxx`这个命令
这是因为Shell将文件名中的`;`解析为按顺序执行命令。
或者您的文件名以空白起始而在shell中无论多少个空格都会被解析为一个分隔符。您甚至不能使用命令重命名此文件。
这个时候就要用到脱字符`\`了,它能够将一个具有特殊含义的字符转换普通字符。上面的两个任务。可以在文件名中每个特殊字符前加一个`\`,像这样
```sh
less \;xxx
less \ \xxx
less \;\ \&\xxx
```
也可以使用""将文件名括起来,例如 `less "; &xxx"`,在很多情况下,这样甚至更方便。
脱字符在shell中也可以作为换行符在一个命令的末尾添加一个\,然后回车,在下一行继续输入命令甚于的部分,将一个命令拆分为多行且不影响它的执行(如果执行一个很长的命令,请将它拆分为多行以便于阅读)
事实上换行符也符合脱字符的定义。回车键有两个含义一个执行Enter另一个换行折线箭头。在shell中它作为控制字符执行使用脱字符后它便代表排版字符换行了。
### 设置您的默认Shell
如果能够拥有root权限可以直接修改/etc/passwd文件。找到您用户id起始的行。
```shell
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
```she
chsh -s /bin/zsh
(需要输入您的密码)
```
### 设定命令的搜索路径
使用` echo $PATH`可以显示$PATH变量输出如下
```shell
/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/bin/X11 /usr/games /usr/X11R6/bin
```
它是一个环境变量代表执行命令时shell的搜索路径。
执行一个命令时shell会到$PATH变量定义的路径去搜索并运行与命令同名的可执行文件。如果程序、脚本等可执行文件并不再上面的路径中就必须使用绝对路径或者相对路径定位可执行文件。
例如:
```shell
/usr/local/mplayer -menu xxx.rmvb
cd /usr/local/ && ./mplayer -menu xxx.rmvb
```
可以修改/etc/environment文件来设定您的命令搜索路径找到PATH起始的行
```shell
PATH:"$PATH:/user/"
```
在双引号中添加您的自定义路径,并以:分隔。
参考资料:
- [开源世界旅行手册](https://i.linuxtoy.org/docs/guide/)