The Linux Command Line - zhongjiajie/zhongjiajie.github.com GitHub Wiki

The Linux Command Line

书籍链接

The Linux Command Line

目录

书籍正文

引言

一提到 Linux,许多人都会说到“自由”,但我不认为他们都知道“自由”的真正涵义。“自由”是一种权力,它决定你的计算机能做什么,同时能够拥有这种“自由”的唯一方式就是知道计算机正在做什么。“自由”是指一台没有任何秘密的计算机,你可以从它那里了解一切,只要你用心的去寻找。

图形用户界面让简单的任务更容易完成,而命令行界面使完成复杂的任务成为可能

这本书讲什么:这本书介绍如何生存在 Linux 命令行的世界。不像一些书籍仅仅涉及一个程序,比如像 shell 程序,bash。这本书将试着向你传授如何与命令行界面友好相处。它是怎样工作的? 它能做什么?使用它的最好方法是什么?

然而任何一个关于命令行的深入讨论,都一定会牵涉到 系统管理方面的内容,这本书仅仅提到一点儿管理方面的知识。

书本组成

  • 命令行的来源与知识,是当前的部分
  • 学习 shell 开始探究命令行基本语言,包括命令组成结构, 文件系统浏览,编写命令行,查找命令帮助文档
  • 配置文件及环境 讲述了如何编写配置文件,通过配置文件,用命令行来 操控计算机
  • 常见任务及主要工具 探究了许多命令行经常执行的普通任务
  • 编写 Shell 脚本 介绍了 shell 编程,一个无可否认的基本技能,能够自动化许多 常见的计算任务,很容易学

Linux 只是操作系统的内核名字,没别的含义。当然内核非常重要,因为有它, 操作系统才能运行起来,但它并不能构成一个完备的操作系统

学习Linux

什么是shell

几乎所有的 Linux 发行版都提供一个名为 bash 的来自 GNU 项目的 shell 程序。bash 是 “Bourne Again SHell” 的首字母缩写, 所指的是这样一个事实,bash 是最初 Unix 上由 Steve Bourne 写成 shell 程序 sh 的增强版

终端仿真器:当使用图形用户界面时,我们需要另一个和 shell 交互的叫做终端仿真器的程序。 如果我们浏览一下桌面菜单,可能会找到一个。虽然在菜单里它可能都 被简单地称为 “terminal”

[me@linuxbox ~]$:当 shell 准备好了去接受输入时,它就会出现。如果提示符的最后一个字符是“#”, 而不是“$”, 那么这个终端会话就有超级用户权限

命令历史:按下上箭头按键,我们会看到之前输入的命令重新出现在提示符之后。这就叫做命令历史。许多 Linux 发行版默认保存最后输入的500个命令

简单的命令

  • date: 这个命令显示系统当前时间和日期
  • cal: 默认显示当前月份的日历
  • df: 查看磁盘剩余空间的数量
  • free:显示空闲内存的数量

幕后控制台: 即使终端仿真器没有运行,在后台仍然有几个终端会话运行着。它们叫做虚拟终端或者是虚拟控制台。这些终端会话都可以通过按下 Ctrl-Alt-F1 到 Ctrl-Alt-F6 访问。当一个会话被访问的时候, 它会显示登录提示框,我们需要输入用户名和密码。要从一个虚拟控制台转换到另一个, 按下 Alt 和 F1-F6(中的一个)。返回图形桌面,按下 Alt-F7。

文件系统中跳转

第一件事(除了打字之外)是如何在 Linux 文件系统中跳转

实现此的命令

  • pwd(print working directory): 打印出当前工作目录名。首次登录系统后,pwd是家目录。每个用户都有他自己的家目录,当用户以普通用户的身份操控系统时,家目录是唯一 允许用户对文件进行写入的地方

  • cd(Change directory): 更改目录。路径名可通过两种方式来指定,一种是绝对路径,另一种是相对路径、绝对路径要从根目录开始写/,相对路径.指的是工作目录,..指的是工作目录的父目录。在几乎所有的情况下,可以省略”./”直接cd Downloads

    快捷键 运行结果
    cd 更改工作目录到你的家目录
    cd - 更改工作目录到先前的工作目录
    cd ~user_name 更改工作目录到用户家目录。例如, cd ~bob 会更改工作目录到用户“bob”的家目录
  • ls(list): 列出目录内容。可以列出任一个目录的内容,而不只是当前工作目录的内容

    • 文件系统树

      Linux以分层目录结构来组织所有文件。 这就意味着所有文件组成了一棵树型目录(其它系统中叫做文件夹), 这个目录树可能包含文件和其它的目录。文件系统中的第一级目录称为根目录。根目录包含文件和子目录,子目录包含更多的文件和子目录,依此类推

      • Linux,总是只有一个单一的文件系统树
      • /usr/bin:大多数系统程序都安装在这个目录下
      • 关于Linux的文件名:
      • .字符开头的文件名是隐藏文件,可以用ls -a查看
      • 文件名和命令名是大小写敏感的
      • 但标点符号仅限 使用 “.”,“-”,下划线。表示词与 词间的空格,用下划线字符来代替

探究操作系统

  • ls乐趣

    • 查看当前目录下的内容: ls
    • 查看指定目录下的内容: ls /usr
    • 查看多个目录下的内容: ls ~/Downloads /usr
    • 长模式查看目录下的内容: ls -l
    • 长模式且按时间排序: ls -lt (--reverse相反的顺序)
    选项 长选项 描述
    -a --all 列出所有文件,甚至包括文件名以圆点开头的默认会被隐藏的隐藏文件
    -d --directory 通常,如果指定了目录名,ls 命令会列出这个目录中的内容,而不是目录本身。 把这个选项与 -l 选项结合使用,可以看到所指定目录的详细信息,而不是目录中的内容
    -F --classify 这个选项会在每个所列出的名字后面加上一个指示符。例如,如果名字是 目录名,则会加上一个'/'字符
    -h --human-readable 当以长格式列出时,以人们可读的格式,而不是以字节数来显示文件的大小
    -l 以长格式显示结果
    -r --reverse 以相反的顺序来显示结果。通常,ls 命令的输出结果按照字母升序排列
    -S 命令输出结果按照文件大小来排序
    -t 按照修改时间来排序
    • 长模式下的各个参数的意义

      o-rw-r--r-- 1 root root 358374 2007-04-03 11:05 ubuntu Sax.ogg

      字段 含义
      -rw-r--r-- 对于文件的访问权限。第一个字符指明文件类型。在不同类型之间, 开头的“-”说明是一个普通文件,“d”表明是一个目录。其后三个字符是文件所有者的 访问权限,再其后的三个字符是文件所属组中成员的访问权限,最后三个字符是其他所 有人的访问权限。这个字段的完整含义将在第十章讨论
      1 文件的硬链接数目。参考随后讨论的关于链接的内容
      root 文件属主的用户名
      root 文件所属用户组的名字
      32059 以字节数表示的文件大小
      2007-04-03 11:05 上次修改文件的时间和日期
      oo-cd-cover.odf 文件名
  • 确定文件类型

    • file命令会打印出文件内容的简单描述
    [me@linuxbox ~]$ file picture.jpg
    picture.jpg: JPEG image data, JFIF standard 1.01
  • 用 less 浏览文件内容

    • less filename
    • less属于”页面调度器”程序类,这些程序允许通过页方式,在一页中轻松地浏览长长的文本文档。然而 more 程序只能向前分页浏览,而 less 程序允许前后分页浏览,它还有很多其它的特性
    命令 行为
    Page UP or b 向上翻滚一页
    Page Down or space 向下翻滚一页
    UP Arrow 向上翻滚一行
    Down Arrow 向下翻滚一行
    G 移动到最后一行
    1G or g 移动到开头一行
    /charaters 向前查找指定的字符串
    n 向前查找下一个出现的字符串,这个字符串是之前所指定查找的
    h 显示帮助屏幕
    q 退出 less 程序
  • Linux系统中的目录

    目录 评论
    / 根目录,万物起源
    /bin 包含系统启动和运行所必须的二进制程序
    /boot 包含 Linux 内核,最初的 RAM 磁盘映像(系统启动时,由驱动程序所需),和 启动加载程序,有趣的文件:/boot/grub/grub.conf or menu.lst, 被用来配置启动加载程序 /boot/vmlinuz,Linux 内核
    /dev 这是一个包含设备结点的特殊目录。“一切都是文件”,也使用于设备。 在这个目录里,内核维护着它支持的设备
    /etc 这个目录包含所有系统层面的配置文件。它也包含一系列的 shell 脚本, 在系统启动时,这些脚本会运行每个系统服务。这个目录中的任何文件应该是可读的文本文件。有意思的文件:虽然/etc 目录中的任何文件都有趣,但这里只列出了一些我一直喜欢的文件:/etc/crontab, 定义自动运行的任务。/etc/fstab,包含存储设备的列表,以及与他们相关的挂载点。/etc/passwd,包含用户帐号列表
    /home 在通常的配置环境下,系统会在/home 下,给每个用户分配一个目录。普通只能 在他们自己的目录下创建文件。这个限制保护系统免受错误的用户活动破坏
    /lib 包含核心系统程序所需的库文件。这些文件与 Windows 中的动态链接库相似
    /lost+found 每个使用 Linux 文件系统的格式化分区或设备,例如 ext3文件系统, 都会有这个目录。当部分恢复一个损坏的文件系统时,会用到这个目录。除非文件系统 真正的损坏了,那么这个目录会是个空目录
    /media 在现在的 Linux 系统中,/media 目录会包含可移除媒体设备的挂载点, 例如 USB 驱动器,CD-ROMs 等等。这些设备连接到计算机之后,会自动地挂载到这个目录结点下
    /mnt 在早些的 Linux 系统中,/mnt 目录包含可移除设备的挂载点
    /opt 这个/opt 目录被用来安装“可选的”软件。这个主要用来存储可能 安装在系统中的商业软件产品
    /proc 这个/proc 目录很特殊。从存储在硬盘上的文件的意义上说,它不是真正的文件系统。 反而,它是一个由 Linux 内核维护的虚拟文件系统。它所包含的文件是内核的窥视孔。这些文件是可读的, 它们会告诉你内核是怎样监管计算机的
    /root root 帐户的家目录
    /sbin 这个目录包含“系统”二进制文件。它们是完成重大系统任务的程序,通常为超级用户保留
    /tmp 这个/tmp 目录,是用来存储由各种程序创建的临时文件的地方。一些配置,导致系统每次 重新启动时,都会清空这个目录
    /usr 在 Linux 系统中,/usr 目录可能是最大的一个。它包含普通用户所需要的所有程序和文件
    /usr/bin /usr/bin 目录包含系统安装的可执行程序。通常,这个目录会包含许多程序
    /usr/lib 包含由/usr/bin 目录中的程序所用的共享库
    /usr/local 这个/usr/local 目录,是非系统发行版自带,却打算让系统使用的程序的安装目录。 通常,由源码编译的程序会安装在/usr/local/bin 目录下。新安装的 Linux 系统中,会存在这个目录, 但却是空目录,直到系统管理员放些东西到它里面
    /usr/sbin 包含许多系统管理程序
    /usr/share /usr/share 目录包含许多由/usr/bin 目录中的程序使用的共享数据。 其中包括像默认的配置文件,图标,桌面背景,音频文件等等
    /usr/share/doc 大多数安装在系统中的软件包会包含一些文档。在/usr/share/doc 目录下, 我们可以找到按照软件包分类的文档
    /var 除了/tmp 和/home 目录之外,相对来说,目前我们看到的目录是静态的,这是说, 它们的内容不会改变。/var 目录是可能需要改动的文件存储的地方。各种数据库,假脱机文件, 用户邮件等等,都驻扎在这里
    /var/log 这个/var/log 目录包含日志文件,各种系统活动的记录。这些文件非常重要,并且 应该时时监测它们。其中最重要的一个文件是/var/log/messages。注意,为了系统安全,在一些系统中, 你必须是超级用户才能查看这些日志文件
  • 操作文件和目录

    • cp: 复制文件和目录

      • cp item1 item2: 复制单个文件或目录"item1"到文件或目录"item2"
      • cp item... Directory: 复制多个项目(文件或目录)到一个目录下
      • cp的选项
      选项 意义
      -a, --archive 复制文件和目录,以及它们的属性,包括所有权和权限。 通常,复本具有用户所操作文件的默认属性
      -i, --interactive 在重写已存在文件之前,提示用户确认。如果这个选项不指定, cp 命令会默认重写文件
      -r, --recursive 递归地复制目录及目录中的内容。当复制目录时, 需要这个选项(或者-a 选项)
      -u, --update 当把文件从一个目录复制到另一个目录时,仅复制 目标目录中不存在的文件,或者是文件内容新于目标目录中已经存在的文件
      -v, --verbose 显示翔实的命令操作信息
    • mv: 移动/重命名文件和目录

      • cp的使用方法很像
      • cp共享和很多选项
      选项 意义
      -i --interactive 在重写一个已经存在的文件之前,提示用户确认信息。 如果不指定这个选项,mv 命令会默认重写文件内容
      -u --update 当把文件从一个目录移动另一个目录时,只是移动不存在的文件, 或者文件内容新于目标目录相对应文件的内容
      -v --verbose 当操作 mv 命令时,显示翔实的操作信息
    • mkdir: 创建目录

    • rm: 删除文件和目录

      选项 意义
      -i, --interactive 在删除已存在的文件前,提示用户确认信息。如果不指定这个选项,rm 会默默地删除文件
      -r, --recursive 递归地删除文件,这意味着,如果要删除一个目录,而此目录 又包含子目录,那么子目录也会被删除。要删除一个目录,必须指定这个选项
      -f, --force 忽视不存在的文件,不显示提示信息。这选项颠覆了"--interactive"选项
      -v, --verbose 在执行 rm 命令时,显示翔实的操作信息
    • ln: 创建硬链接和符号链接

      • ln file link: 创建硬链接
      • ln -s item link: 创建符号链接
    • 通配符 shell 频繁地使用文件名,shell 提供了特殊字符来帮助你快速指定一组文件名

      通配符 意义
      * 匹配任意多个字符(包括零个或一个)
      ? 匹配任意一个字符(不包括零个)
      [characters] 匹配任意一个属于字符集中的字符
      [!characters] 匹配任意一个不是字符集中的字符
      :class: 匹配任意一个属于指定字符类中的字符
      [:alnum:] 匹配任意一个字母或数字
      [:alpha:] 匹配任意一个字母
      [:digit:] 匹配任意一个数字
      [:lower:] 匹配任意一个小写字母
      [:upper:] 匹配任意一个大写字母

⚠️ **GitHub.com Fallback** ⚠️