更新时间 来源 作者
2017/06/05 07:25:24 segmentfault.com zhangwang

转载者注:

本文来源于segmentfault.com,后转载至m.linuxidc.com,因前者原文已失传,后者排版过于垃圾,故而搬运至此,方便查阅 ,也利于保护视力 。搬运完成后,本文将持续更新,加入个人见解,直至形成原创文章。


我以前经常在网上查类似于:

  • “在Ubuntu下如何让某个用户对某个文件夹拥有可读可写的权限?”
  • “Mac上如何通过命令行启动某个程序?”
  • “在Linux中如何彻底卸载某个软件?”

这类的问题。

当然这类问题都可以较容易的在网上找到解决方案,但是每次解决我都是知其然不知其所以然,所以当下次我碰到类似的问题时,我还是要花一定的时间去查,这让我有一种挫败感;开发相关的知识大多变得特别快,但是有些知识特别经典,其实比起某些库或框架也许更值得系统的了解。

这也是本文的写作初衷,一方面是自己对近两个月来看的相关资料做一个总结,另一方面也希望可以帮助Linux初学者更好的理解,运用这个系统。

先决条件

Linux安装

在学习Linux之前,你需要拥有一台搭载Linux的设备,这里推荐使用常见的Linux发行版之一Ubuntu 20.04。

你可以在这里找到其安装方法。

Linux配置

由于各类Linux发行版不像Windows那样可以开箱即用,安装完成之后需要进行各类配置,可以参考这篇文章

Linux快速开始

图形界面

在Windows下,我们习惯于使用各种具有完善图形界面的软件,毫无疑问,图形界面大大降低了普通人使用电脑的成本,甚至个人计算机的普及,图形界面都功不可没。

在Linux下也有图形界面(俗话说的桌面),我们可以先看看实验楼《Linux基础入门》中对此的描述:

相对于现在的 Windows 系统,UNIX/Linux 本身是没有图形界面的,我们通常在 UNIX/Linux 发行版上看到的图形界面实际都只是运行在 Linux 系统之上的一套软件,而 Linux 上的这套软件以前是 XFree86,现在则是 xorg(X.Org),而这套软件又是通过 X 窗口系统(X Window System,也常被称为 X11 或 X)实现的,X 本身只是工具包及架构协议,而 xorg 便是 X 架构规范的一个实现体,也就是说它是实现了 X 协议规范的一个提供图形界面服务的服务器,就像实现了 http 协议提供 web 服务的 Apache 。如果只有服务器也是不能实现一个完整的桌面环境的,当然还需要一个客户端,我们称为 X Client,像如下几个大家熟知也最流行的实现了客户端功能的桌面环境 KDE,GNOME,XFCE,LXDE 。

命令行,终端,Shell和Console

对Linux图形界面的有关描述中,总是不乏提及命令行,可见其重要性。

命令行(CLI)

引自维基百科-命令行界面

命令行界面是相对于图形界面而言的,较图形用户界面节约计算机系统的资源。在熟记命令的前提下,使用命令行界面往往要较使用图形用户界面的操作速度要快。命令行中,可以使用脚本语言和宏语言,以其提供更加丰富的控制与自动化的系统管理能力。

终端(Terminal)

终端特指计算机或通信网络中输入或输出信息的装置,通常由键盘和显示器等组成。但是使用Mac或者安装好了Ubuntu的童鞋会发现有一个程序也叫终端(Terminal),在某种意义上,终端还是我们与系统交互的窗口,严格来讲,我们现在在系统中运行的终端程序只是终端模拟器(常见的终端模拟器有以下几个: gnome-terminal,kconsole,xterm,rxvt,kvt,nxterm 和 eterm),更多关于终端的描述,可以参考这篇文章

这里还得插一句:终端本质上是对应着 Linux 上的 /dev/tty 设备(设备稍后详述),Linux 的多用户登陆就是通过不同的 /dev/tty 设备完成的.

shell

英语好的同学一下子就可以看出shell是壳的意思,有壳就有核,核指的是 UNIX/Linux 内核,Shell之所以叫Shell 是因为它隐藏了操作系统底层的细节。我们可以换个大家一下就能懂的词来理解Shell:命令解析器。

当我们在终端中输入node,按回车,会启用node解释器,输入python按回车会启动Python解释器,之后就可以在里面输入并执行对应语言的代码啦。

在 UNIX/Linux 中比较流行的常见的 Shell 有 bash、zsh(用没用过美美的oh my zsh)、ksh、csh 等等,Ubuntu 终端默认使用的是 bash。本文后面对shell命令的讲解也大多基于bash。

console

从字面上来讲,console是控制台的意思,现在的console一般与终端在外表上没什么区别,不过其在功能上却大不相同,console的出现有其历史原因,简单的说来,就是在以前电脑还是很稀缺的物件的年代,一台电脑是会陪伴多套终端的,这时候就需要专门的系统管理员利用console来管理系统。目前对一般人来说console的作用可能没有那么大了,不过可能其还是会在一些特殊场景下有很大的作用,具体我也不是很清楚,在此就不阐述了。

终端分字符终端和图形终端。字符终端(Character Terminal)也叫文本终端(Text Terminal),是只能接收和输出文本信息的终端。图形终端(Graphics Terminal)不但可以接收和输出文本信息,也可以输出图形图像。

一般说来字符终端的的标准是DEC公司1978制造的型号为VT100的终端。而图形终端的标准是X Window,它是大多数Unix-like系统GUI界面的基础,xterm是Unix世界里最著名的图形终端模拟程序。

以Ubuntu具体说来,它默认提供七个终端,其中第一个到第六个虚拟控制台是全屏的字符终端,第七个虚拟控制台是图形终端,用来运行GUI程序,按快捷键Ctrl+Alt+F1Ctrl+Alt+F2…,Ctrl+Alt+F6Ctrl+Alt+F7可完成对应的切换。

shell的使用

shell可能是我们在Linux下使用最多的工具了,本小节我们我们以bash为例,当然zsh下以下命令也是适用的,我们先熟悉一下shell的基本操作。

输入和输出

命令行的操作分为输入和输出两个方面:

  • 输入:打开终端,按键盘输入,按回车结束输入并执行;

  • 输出:输出会返回你想要的结果,比如你看的是文件,就会返回文件的内容。如果是执行的程序,执行失败会告诉你哪里错了,如果施行成功会没有输出,这是linux的哲学:没有结果就是最好的结果。

提高输入效率

合理的使用快捷键确实可以明显的提高工作效率,尤其是类似Tab这样的补全键,对shell常用快捷键的总结如下:

  • Tab:点击Tab键可以实现命令补全,目录补全、命令参数补全;

  • Ctrl+C: 强行终止当前程序(常用);

  • Ctrl+D: 键盘输入结束或退出终端(常用);

  • Ctrl+S: 暂停当前程序,暂停后按下任意键恢复运行;

  • Ctrl+Z: 将当前程序放到后台运行,恢复到前台为命令fg;

  • Ctrl+A: 将光标移至输入行头,相当于Home键;

  • Ctrl+E: 将光标移至输入行末,相当于End键;

  • Ctrl+K: 删除从光标所在位置到行末,常配合Ctrl+A使用;

  • Alt+Backspace: 向前删除一个单词,常配合Ctrl+E使用;

  • Shift+PgUp: 将终端显示向上滚动;

  • Shift+PgDn: 将终端显示向下滚动;

  • 方向键: 浏览历史输入记录;

熟练运用上述的操作技巧将大大提升我们命令行的操作效率。

常见的bash命令

真正解决问题需要应用各种bash命令。

文件相关
  • ls: 列出某文件夹下的文件,添加参数可实现更细致的功能,

  • ls -a: 列出所有文件,包括隐藏文件

  • ls -l: 列出文件及其详细信息

  • cd: 切换目录,cd到不存在的目录时会报错

  • pwd: 打印当前目录

  • cat: 读取某一个文件内的内容

  • wc: 获取某一个文件的行数和字数,如:

    1
    2
    $ wc package.json
    # 79 175 2712 package.json
  • cp: 复制某文件

  • mkdir: 创建目录

  • rmdir: 删除目录

  • rm -rf: r表示删除内部所有文件,f参数表示强制,rm -r junk可用来删除/junk目录及其下面的所有文件;

  • mv移动: mv photos.jpg Photos可将将photos.jpg移动到文件夹/Photos

  • sort: 排序

  • diff: 比较两个文件的异同

系统相关
  • date: 获取当前时间

  • uname: 返回系统名称

  • hostname: 返回系统的主机名称

网络相关:
  • host xx.xxx.com: 显示某域名相关托管服务器/邮件服务器

  • ping 8.8.8.8: 检测到地址8.8.8.8的连接

搜索相关命令:
  • whereis:

    这是一个搜索速度很快的命令,因为它并没有从硬盘中依次查找,而是直接从数据库中查询。whereis 只能搜索二进制文件(-b),man 帮助文件(-m)和源代码文件(-s),可以这样使用它:

    1
    $ whereis who
  • locate:

    一个快而全的搜索指令。它通过/var/lib/mlocate/mlocate.db 数据库查找,不过这个数据库也不是实时更新的,系统会使用定时任务每天自动执行 updatedb 命令更新一次,所以有时候你刚添加的文件,它可能会找不到,需要手动执行一次 updatedb 命令(在我们的环境中必须先执行一次该命令)。

    locate命令可带参数,如-i 参数可以忽略大小写进行查找。可以用来查找指定目录下的不同文件类型。

    你可以使用以下命令查找/etc下所有以sh开头的文件

    1
    $ locate /etc/sh

    查找/usr/share/下所有后缀为jpg的文件,注意*前面要添加反斜杠\来转义,否则会找不到文件:

    1
    $ locate /usr/share/\*.jpg
  • which:

    我们通常使用 which 来确定是否安装了某个指定的软件,因为它只从 PATH 环境变量指定的路径中去搜索命令,如:

    1
    $ which man
  • find:

    find可以说是这几个命令中最强大的了,它不但可以通过文件类型、文件名进行查找而且可以根据文件的属性(如文件的时间戳,文件的权限等)进行搜索。

    find命令的格式为:

    1
    $ find [path] [option] [action]

    如:

    1
    2
    3
    $ sudo find /etc/ -name interfaces/

    $ sudo find /etc/ -name \*.list
其它:
  • --version/-V: 查看某个程序的版本

  • history: 显示历史

  • echo: 返回你给的值,可以简单理解为js中的console或python中的print

  • man使用一个叫做less的程序,查看某个命令的帮助文档

…未完待续

后续步骤

请参见