Unix风格的目录结构通常使用一个目录名列表并用正斜杠分隔来表示,这样我们可以结合ls命令:

$ ls /Users/mhartl/ruby

或者

$ ls /usr/local/bin

正如图20,这些表示对应的目录在一个分层的文件系统,图上意思即使mhartl是Users的子目录,而ruby是mhartl的子目录。

图20:文件夹或目录间的对应

当谈起这些目录时根据规范会有不同: 像/Users/mhartl的用户目录可以读作'斜杠 users斜杠mhartl'或者'斜杠users mhartl',省略原来的斜杆在发音时很常见,比如系统目录,'/usr/local/bin',发音可能是'user local bin'.由于所有的Unix目录最终都是根目录/(读作斜杠)的子目录,斜杠暗示领导和分隔。注意: 将反斜杠错用为正斜杠会带来许多痛苦,要严格避免这种错误。

对一个特殊的用户来说最重要的目录是home目录,在我的macOS系统上是/Users/mhartl,对应我的用户名(mhartl)。home目录可以被指定为绝对路径,如/Users/mhartl,也可以使用home目录的简写,即波浪线符号~(用shift加反撇号输入, 在多数键盘中位于数字1的左边)。所以在图20中显示的两种路径都是一样的:/Users/mhartl/ruby/projects与/ruby/projects一样。(有趣地是,使用波浪符号代替Home目录的原因仅是因为在早先的一些键盘中"Home"键和""键是同一个。)

除了用户目录,每个Unix系统都有程序必须的系统目录用于计算机正常操作。修改系统文件或目录需要管理员权限,也叫root.(这里的"root"与上面提到的根目录没有关系。)管理员的权限太大,所以以root身份登录对文件可以轻易操作不太好;相反,要以root身份执行任务通常使用sudo命令。(Box 11)

Box11. “sudo 让我TODO======”

sudo 让普通用户拥有超级管理员权限。例如, 尝试在系统目录/opt目录中创建一个文件,如下:

$ touch /opt/foo

touch: /opt/foo: Permission denied

因为普通用户没有权限修改/opt,所以命令执行失败了,但若加上sudo命令就可以执行成功:

$ sudo touch /opt/foo

Password:

正如上面显示的, 输入sudo之后,我们被提示输入用户密码,如果正确输入并且用户被赋予sudo的特权(在大多数桌面Unix系统上),那么命令会被成功执行。如图21中,开始这个模式被否认,只有使用了sudo后才能成功执行,这是计算时的共同话题。

为了验证该文件真的被创建了,可以用ls检查:

$ ls -l /opt/foo

-rw-r--r-- 1 root wheel 0 Jul 23 19:13 /opt/foo

注意普通用户可以在系统目录里ls文件(不需要sudo)而且root的名字也在列表中,表示管理员拥有该文件。(第二个术语wheel的意思有一点模糊,但是你可以在管理员这个网站上学习它。)

为了删除刚刚创建的文件,需要再次回到管理员状态:

$ rm -f /opt/foo

rm: /opt/foo: Permission denied

$ sudo !!

$ !ls

ls: /opt/foo: No such file or directory

上面的示例中第一次执行rm失败了,所以再运行sudo !!,该命令运行sudo接着之前的命令,紧跟着我们使用!ls,该命令执行了前一条ls的命令(Box9).

在英语发音中像sudo !!没有任何意义,这在语言交流时非常重要。正如Box9中提及到的,!!读作"bang bang".然而sudo读作'SOO-doo'或'SOO-doh'.两种发音都很常见。因此,我更喜欢将'sudo !!'读作"SOO-doo bang bang".

顺便提下,su在sudo原本的意义中是'super-user',但是后来被扩展使用了, 现在通常认做是'substitute user'(代替用户)。sudo因此就是“substitute user do”(代替用户执行)的结合,即默认地用户代替管理员。由于管理员可以做任何事,在图21中的命令‘sudo make me a sandwich’成功执行了,而'make me a sandwich'没有成功。

图21: “[Sandwich](https://m.xkcd.com/149/)”(from [xkcd](https://xkcd.com/))sudo 行为的幽默

练习

1.写下你对目录~/foo/bar的发音单词。

2.在/Users/bill/sonnets该文件中,哪个是home目录?哪个是用户名?在这个等级结构中哪个是最深的目录?

3.对于一个用户名为bill的用户,/Users/bill/sonnets和~/sonnets的差别是什么?(如果有的话)

4.1《想成为黑客,不知道这些命令行可不行》(Learn Enough Command Line to Be Dangerous)—目录结构的更多相关文章

  1. 4《想成为黑客,不知道这些命令行可不行》(Learn Enough Command Line to Be Dangerous)—目录

    我们已经学习过许多处理文件的Unix工具,现在是时候来学习目录了,也就是文件夹(图20).正如我们所见,许多在文件中的开发思想也适用于目录,但同样也有许多区别.

  2. 4.3《想成为黑客,不知道这些命令行可不行》(Learn Enough Command Line to Be Dangerous)—链接到目录

    在4.2章中我们已经会用cd进入到指定的目录中.这是导航最常见的用途之一,但是它还有几个值得关注的用途.第一个是使用cd ..(读作'see-dee 点点')返回当前目录级别的上一级: $ pwd / ...

  3. 2《想成为黑客,不知道这些命令行可不行》(Learn Enough Command Line to Be Dangerous)——操作文件

    已经学习了基本的命令,现在是时候学习操作文件了,这也是命令行的重要任务.还是基于本教程的事先规定,本教程是入门级的,不要求熟悉类似编辑文本的程序(这些文本编辑程序,将在下个系列教程中介绍, Learn ...

  4. 1.1《想成为黑客,不知道这些命令行可不行》(Learn Enough Command Line to Be Dangerous)——运行终端

    终端是个允许我们运行命令行的程序,运行命令前,先打开它.在MacOS系统上,可以使用macOS应用 Spotlight来打开终端窗口,Spotlight也有其他两种方式触发,一种是键入⌘␣(comma ...

  5. 1.3《想成为黑客,不知道这些命令行可不行》(Learn Enough Command Line to Be Dangerous)——手册页

    我们运行的命令行程序,通常在技术上称作shell, 它包含了一个非常强大(也很神秘)的工具,我们将用它来学习更多可用的命令.这个工具本身就是个称作'man'的命令('manual'的简写).它的参数是 ...

  6. 3.1《想成为黑客,不知道这些命令行可不行》(Learn Enough Command Line to Be Dangerous)——下载文件

    首先,为了不手动创建一个长文件(这太麻烦了),我们将使用强大的curl(有时也写作"cURL")工具从网上下载一个文件,这个命令可以让命令行与URL交互.尽管这不是Unix核心命令 ...

  7. 2.3《想成为黑客,不知道这些命令行可不行》(Learn Enough Command Line to Be Dangerous)——重命名,复制,删除

    最常用的文件操作除了将文件列出来外,就应该是重命名,复制,删除了.正如将文件列出来一样,大多数现代操作系统为这些任务提供了用户图形界面,但是在许多场景中,用命令行还是会更方便. 使用mv命令重命名一个 ...

  8. 1.2《想成为黑客,不知道这些命令行可不行》(Learn Enough Command Line to Be Dangerous)——开始第一条命令

    现在开始准备运行我们的第一条命令了,在屏幕上打印'hello'.(字符打印的地方被称为'标准输出',通常指的是屏幕,很少指真的物理打印机设备).这条命令就是echo,这条命令的参数是想要输出的字符串或 ...

  9. 1.4《想成为黑客,不知道这些命令行可不行》(Learn Enough Command Line to Be Dangerous)——编辑命令

    在编辑模式中,命令行包括几个重复之前命令的功能.这些以及其他很多命令功能时常设计键盘上的特殊键,所以给出Table 1作为参考,给出了许多键在典型的Macintosh键盘上的标记符号.若你的键盘不太一 ...

随机推荐

  1. Android Studio 使用ViewPager + Fragment实现滑动菜单Tab效果 --简易版

    描述: 之前有做过一个记账本APP,拿来练手的,做的很简单,是用Eclipse开发的: 最近想把这个APP重新完善一下,添加了一些新的功能,并选用Android Studio来开发: APP已经完善了 ...

  2. Android常用数据类型转换

    String转int.float.double.byte[].bitmap Int i = Integer.parseInt(str); Float f = Float.parseFloat(str) ...

  3. 安卓开发之Room实体定义数据

    使用Room实体定义数据 在Room库中,entities(实体)代表着相关字段集.每一个entity(实体)代表着相关联数据库中的一个表.entity 类必须通过Database 类中的entiti ...

  4. 移动端web页面开发常用的头部标签设置

    在移动端web页面开发中,我们常需要设置各种头部标签以帮助浏览器更好的解析页面,将页面完美呈现,这里列出了工作中常用的各种头部标签,以备查询. viewport <meta name=" ...

  5. MySQL写入用户微信名

    很简单的需求,将用户微信名写入MySQl即可,但是测试过程中却遇到了问题,微信名中的emoji写入数据库失败.解决步骤如下 1.了解utf8mb4 MySQL从5.5.3版本开始支持utf8mb4编码 ...

  6. 使用wxpy自动发送微信消息(加强版)

    通过使用wxpy自动发送微信消息后,笔者又加强了发送消息,堪称消息爆炸式发送 目前设置的为10秒发送一次,发送9次,每次发送10条内容 import requests import wxpy from ...

  7. 洗礼灵魂,修炼python(29)--装饰器(1)—>利用经典案例解析装饰器概念

    前提必备 不急着进入正题,在前面函数作用域那一章介绍了闭包,全局变量局部变量,这里再看几个简单的闭包案例: 1):不带参数 注意: 1.这里的name属性是每个函数都有的,可以反馈函数名 2.temp ...

  8. 洗礼灵魂,修炼python(26)--编程核心之“递归”

    递归 1.什么是递归: 其实前面都提过,但没有详细讲.多次调用自身就叫递归 看图,这种就叫递归 看过盗梦空间没?其实也是递归 2.递归需要满足条件: 有调用函数自身 有一个正确的返回条件来结束 在使用 ...

  9. python第三十一天-----类的封装、继承,多态.....

    封装 封装最好理解了.封装是面向对象的特征之一,是对象和类概念的主要特性. 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏. cla ...

  10. 图解get方法与filter方法

    在django的数据库查找方法中,get与filter方法是查找单目数据,用图记录了这两个方法查找数据各自返回的是什么?