一、桌面环境
1.1 Linux 桌面环境介绍
相对于现在的 Windows 系统,UNIX/Linux 本身是没有图形界面的,我们通常在 UNIX/Linux 发行版上看到的图形界面实际都只是运行在 Linux 系统之上的一套软件,类似 Windows95 之前的 Windows 的图形界面实则也只是运行在 DOS 环境的一套软件。而 Linux 上的这套软件以前是 XFree86,现在则是 xorg(X.Org),而这套软件又是通过 X 窗口系统(X Window System,也常被称为 X11 或 X)实现的,X 本身只是工具包及架构协议,而 xorg 便是 X 架构规范的一个实现体,也就是说它是实现了 X 协议规范的一个提供图形界面服务的服务器,就像实现了 http 协议提供 web 服务的 Apache 。如果只有服务器也是不能实现一个完整的桌面环境的,当然还需要一个客户端,我们称为 X Client,像如下几个大家熟知也最流行的实现了客户端功能的桌面环境 KDE,GNOME,XFCE,LXDE 。其中就有你看到的,实验楼目前使用的 XFCE 桌面环境,部分老用户可能可以回想起,实验楼之前使用的环境是 LXDE 。这也意味着在 Linux 上你可以自己选择安装不同的桌面环境,甚至可以定制自己的专属桌面。
这里讲这么多,主要是为了帮助你更好地理解 Linux 的桌面环境是一个怎样的概念,以及它跟 Windows 操作系统桌面的差异,实际它们之间是有着本质的差别的,希望清楚这些内容之后可以让你忽略那些体验上的差异,专心把精力放到 Linux 系统本身或者你正准备学习的某一门技术之上,这门实验课后面的内容和实验楼的其它课程便是为了帮助你实现以上两个目标。
1.2 Linux 桌面环境的使用
有兴趣的用户可以在自己的计算机中安装完整的 Linux 发行版或其 Live CD 体验。
二、linux终端
2.1 终端的概念
通常我们在使用 Linux 时,并不是直接与系统打交道,而是通过一个叫做 Shell 的中间程序来完成的,在图形界面下为了实现让我们在一个窗口中完成用户输入和显示输出,Linux 系统还提供了一个叫做终端模拟器的程序(Terminal),下面是几个比较常见的终端模拟器: gnome-terminal,Konsole,xterm,rxvt,kvt,nxterm 和 eterm 。不过要注意的是这里所说的终端(Terminal)和控制台(Console)是有区别的。
作者:2lppsctk
链接:https://www.zhihu.com/question/21711307/answer/56056972
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
在UNIX的术语中,最简单的回答是:
终端(terminal)=tty=文本的输入输出环境
控制台(console)=物理终端
shell=命令行解释器
控制台,终端和tty是密切相关的。原本它们都表示一台可以和计算机交互的设备:在UNIX的早期阶段,此类设备大多指电传机器(像一台打字机一样),这种设备有时也叫做电传打字机,缩写为TTY。“终端”(terminal)这个名字是从电子的观点来看的,而“控制台”是从设备的角度来看的。在UNIX历史的极早期阶段,电子键盘和显示器就已经是一种规范的终端。在UNIX术语中,tty是一种特殊的设备文件,它在read和write之外还实现了一些特殊的命令(ioctls)。
通常意义上terminal是tty的代名词。有的tty由(软件)内核来代替硬件设备,比如从键盘发送过来的input,以及发送到文本模式的屏幕上的output,或者在串行线上传输的input/output流。
还有一种tty——有时候叫做伪tty(pseudo-ttys)的,它是由叫做”终端模拟器“的程序提供的(通过一个中间层),这种tty例如Xterm(运行在X window系统上),Screen(在一个程序和另一个终端之间提供了中间层),SSH(在另一台电脑上,通过程序连接另一台点奥上的终端),Expect(用脚本和终端交互)之类。
"terminal"这个词通常也有一个更加传统的意思,表示一台能够用来和电脑交互的设备——通常有显示器和键盘。比如一个X terminal(一种瘦客户机——一种特殊用途的计算机),它唯一的作用就是驱动键盘,显示器,鼠标,(偶尔还有)别的外围交互设备;而实际上程序是泡在另外一台更加强大的计算机上的。
Console通常的物理意义上是通过一些手段直接连到机器上的主终端(primary teminal),在一些操作系统(比如Linux和FreeBSD)上console一般有好几个tty(用特定的组合键能够在这些tty之间切换)。有时候这些命名让人混乱,比如操作系统可能把那些tty叫做”console“ ”virtual console“ ”virtual terminal“之类的。
那么,既然说一个虚拟终端是”虚拟(virtual)”的,什么又是“真的”终端?
shell,作为用户登录系统时看到的主界面,它主要的用处就是启动别的程序。(我不确定原来的比喻义是指shell是用户的home环境,还是说shell是其他程序在里面跑的环境)在UNIX圈里,shell 特指命令行shell(并且围绕这这样的描述: “输入你想要运行的应用的额名字,后面跟着文件或者其他的、应用程序应该据此作出调整的东西(翻译:就是参数啦) ,并按回车键。”) 其他类型的环境并不使用“shell”这个词,比如说窗口系统涉及了”窗口管理器“(window managers) 和”桌面环境“(desktop environments),但并不使用”shell“这个词。UNIX shell有很多,比较流行的交互式shell包括bash(大多数Linux发行版的默认选择) zsh(重视功能和可定制性) 还有fish(以简单为主旨)。命令行shell包括了用来组合命令的流程控制结构。除了在交互式提示符下输入命令外,用户还可以编写脚本。大多数shell都有一套共同的语法(基于Bourne shell)。当我们讨论”shell编程”时,shell几乎都指Bourne风格的shell。有的shell经常用来运行脚本,但缺少足够的交互功能(比如说Korn shell——ksh,以及ash的许多变种)。 几乎所有的UNIX-like操作系统都有一个Bourne风格的shell(路径一般是/bin/sh)——而且 不是ash ksh 就是bash。在UNIX系统管理中,一个用户的shell是那个在登录的时候被调用的程序。普通用户账户也拥有命令行shell,受限的用户(比如仅用于传输文件的账户)可能拥有一个受限的shell,或者只能运行特定命令的shell。
终端和shell之间的分工并不是很明显,下面是它们的主要工作:
输入:终端把键盘操作转换成控制序列(比如Left 转换为 \e[D)。
shell再转换控制序列成为命令(比如\e[D 转换为后退字符)。在行编辑(line editon)中,输入历史和输入补全功能是shell提供的。终端有时候会在它自己的行编辑功能中提供输入历史和输入补全功能,并且在命令要执行时通过line发送到shell中。唯一这样做的主流terminal就是Emacs里的M-x。输出:shell发出指令,比如说“display 某某” “切换前景色位绿色” “把光标移动到下一行”之类。而终端就响应这些指令。命令提示符是纯粹的shell概念。shell永远开不到它所运行的命令的输出(除非重定向),输出历史(回滚)仅仅是个终端上的概念。应用程序之间的复制粘贴是由终端提供的(通常用鼠标,或者组合键,比如Ctrl+SHift+V 或Shift+Insert)。 Shell可能有它自己的内部复制粘贴机制(比如Meta+Y,Ctrl+Y)。作业控制(在后台启动程序,并且管理这些程序)主要是由shell执行。不过,是由终端来处理组合键的(比如Ctrl+C 杀死前台程序,或者Ctrl+Z终止任务运行)。
终端本质上是对应着 Linux 上的/dev/tty 设备,Linux 的多用户登陆就是通过不同的 /dev/tty 设备完成的,Linux 默认提供了 6 个纯命令行界面的 “terminal”(准确的说这里应该是 6 个 virtual consoles)来让用户登录。在物理机系统上你可以通过使用[Ctrl]+[Alt]+[F1]~[F6]进行切换。当你切换到其中一个终端后想要切换回图形界面,你可以按下[Ctrl]+[Alt]+[F7]来完成。
2.2 Shell
通常在图形界面中对实际体验带来差异的不是上述的不同发行版的各种终端模拟器,而是这个 Shell(壳)。有壳就有核,这里的核就是指 UNIX/Linux 内核,Shell 是指“提供给使用者使用界面”的软件(命令解析器),类似于 DOS 下的 command(命令行)和后来的 cmd.exe 。
普通意义上的 Shell 就是可以接受用户输入命令的程序。它之所以被称作 Shell 是因为它隐藏了操作系统底层的细节。同样的 UNIX/Linux 下的图形用户界面 GNOME 和 KDE,有时也被叫做“虚拟 shell”或“图形 shell”。
UNIX/Linux 操作系统下的 Shell 既是用户交互的界面,也是控制系统的脚本语言。当然这一点也有别于 Windows 下的命令行,虽然该命令行也提供了很简单的控制语句。在 Windows 操作系统下,有些用户从来都不会直接使用 Shell,然而在 UNIX 系列操作系统下,Shell 仍然是控制系统启动、X11 启动和很多其它实用工具的脚本解释程序。
在 UNIX/Linux 中比较流行的常见的 Shell 有 bash、zsh、ksh、csh 等等,Ubuntu 终端默认使用的是 bash,默认的桌面环境是 GNOME 或者 Unity(基于 GNOME)。
2.3命令行操作体验
2.3.1 写在前面
在linux中,最最重要的就是命令,这就包含了2个过程,输入和输出
输入
输入当然就是打开终端,然后按键盘输入,然后按回车,输入格式一般就是这类的
#创建一个名为 file 的文件,touch是一个命令
touch file
#进入一个目录,cd是一个命令
cd /etc/
#查看当前所在目录
pwd
输出
输出会返回你想要的结果,比如你要看什么文件,就会返回文件的内容。如果只是执行,执行失败会告诉你哪里错了,如果施行成功那么会没有输出,因为linux的哲学就是:没有结果就是最好的结果
开始
双击桌面上的 Xfce 终端 图标打开终端后系统会自动运行 Shell 程序,然后我们就可以输入命令让系统来执行了:
1) 重要快捷键:
真正学习命令行之前,你先要掌握几个十分有用、必需掌握的小技巧:
[Tab]
使用Tab键来进行命令补全,Tab键一般是在字母Q旁边,这个技巧给你带来的最大的好处就是当你忘记某个命令的全称时可以只输入它的开头的一部分,然后按下Tab键就可以得到提示或者帮助完成,当然不止补全命令,补全目录、补全命令参数都是没问题的
[Ctrl+c]
想想你有没有遇到过这种情况,当你在 Linux 命令行中无意输入了一个不知道的命令,或者错误地使用了一个命令,导致在终端里出现了你无法预料的情况,比如,屏幕上只有光标在闪烁却无法继续输入命令,或者不停地输出一大堆你不想要的结果。你想要立即停止并恢复到你可控的状态,那该怎么办呢?这时候你就可以使用Ctrl+c键来强行终止当前程序(你可以放心它并不会使终端退出)。
尝试输入以下命令:
$ tail
然后你会发现你接下来的输入都没有任何反应了,只是将你输入的东西显示出来,现在你可以使用Ctrl+c,来中断这个你目前可能还不知道是什么的程序(在后续课程中我们会具体解释这个tail命令是什么)。
又或者输入:
$ find /
显然这不是你想的结果,可以使用Ctrl+c结束。
虽然这个按着很方便,但不要随便按,因为有时候,当你看到终端没有任何反应或提示,也不能接受你的输入时,可能只是运行的程序需要你耐心等一下,就不要急着按Ctrl+c了。
其他一些常用快捷键
按键 作用
- Ctrl+d 键盘输入结束或退出终端
- Ctrl+s 暂停当前程序,暂停后按下任意键恢复运行
- Ctrl+z 将当前程序放到后台运行,恢复到前台为命令fg
- Ctrl+a 将光标移至输入行头,相当于Home键
- Ctrl+e 将光标移至输入行末,相当于End键
- Ctrl+k 删除从光标所在位置到行末
- Alt+Backspace 向前删除一个单词
- Shift+PgUp 将终端显示向上滚动
9.S hift+PgDn 将终端显示向下滚动
2) 学会利用历史输入命令
很简单,你可以使用键盘上的方向上键↑,恢复你之前输入过的命令,你一试便知。
3) 学会使用通配符
通配符是一种特殊语句,主要有星号(*)和问号(?),用来对字符串进行模糊匹配(比如文件名、参数名)。当查找文件夹时,可以使用它来代替一个或多个真正字符;当不知道真正字符或者懒得输入完整名字时,常常使用通配符代替一个或多个真正字符。
终端里面输入的通配符是由 Shell 处理的,不是由所涉及的命令语句处理的,它只会出现在命令的“参数值”里(它不能出现在命令名称里, 命令不记得,那就用Tab补全)。当 Shell 在“参数值”中遇到了通配符时,Shell 会将其当作路径或文件名在磁盘上搜寻可能的匹配:若符合要求的匹配存在,则进行代换(路径扩展);否则就将该通配符作为一个普通字符传递给“命令”,然后再由命令进行处理。总之,通配符实际上就是一种 Shell 实现的路径扩展功能。在通配符被处理后, Shell 会先完成该命令的重组,然后继续处理重组后的命令,直至执行该命令。
先使用 touch 命令创建 2 个文件,后缀都为 txt:
$ touch adsfasd.txt wergjlkas.txt
可以给文件随意命名,假如过了很长时间,你已经忘了这两个文件的文件名,现在你想在一大堆文件中找到这两个文件,就可以使用通配符:
$ ls *.txt
在创建文件的时候,如果需要一次性创建多个文件,比如:“love_1_linux.txt,love_2_linux.txt,... love_10_linux.txt”。在 Linux 中十分方便:
$ touch love_{1..10}_linux.txt
轻松一下
apt-get install banner
Shell 常用通配符:
字符 含义
- *匹配 0 或多个字符
- ? 匹配任意一个字符
- [list] 匹配 list 中的任意单一字符
- [!list] 匹配 除list 中的任意单一字符以外的字符
- [c1-c2] 匹配 c1-c2 中的任意单一字符 如:[0-9] [a-z]
- {string1,string2,...} 匹配 string1 或 string2 (或更多)其一字符串
- {c1..c2} 匹配 c1-c2 中全部字符 如{1..10}
4) 学会在命令行中获取帮助
在 Linux 环境中,如果你遇到困难,可以使用man命令,它是Manual pages的缩写。
Manual pages 是 UNIX 或类 UNIX 操作系统中在线软件文档的一种普遍的形式, 内容包括计算机程序(包括库和系统调用)、正式的标准和惯例,甚至是抽象的概念。用户可以通过执行man命令调用手册页。
你可以使用如下方式来获得某个命令的说明和使用方式的详细介绍:
$ man <command_name>
比如你想查看 man 命令本身的使用方式,你可以输入:
man man
通常情况下,man 手册里面的内容都是英文的,这就要求你有一定的英文基础。man 手册的内容很多,涉及了 Linux 使用过程中的方方面面。为了便于查找,man 手册被进行了分册(分区段)处理,在 Research UNIX、BSD、OS X 和 Linux 中,手册通常被分为8个区段,安排如下:
区段 说明
1 一般命令
2 系统调用
3 库函数,涵盖了C标准函数库
4 特殊文件(通常是/dev中的设备)和驱动程序
5 文件格式和约定
6 游戏和屏保
7 杂项
8 系统管理命令和守护进程
要查看相应区段的内容,就在 man 后面加上相应区段的数字即可,如:
$ man 1 ls
会显示第一区段中的ls命令 man 页面。
所有的手册页遵循一个常见的布局,为了通过简单的 ASCII 文本展示而被优化,而这种情况下可能没有任何形式的高亮或字体控制。一般包括以下部分内容:
NAME(名称)
该命令或函数的名称,接着是一行简介。
SYNOPSIS(概要)
对于命令,正