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. 纯小白入手 vue3.0 CLI - 3.2 - 路由的初级使用

    vue3.0 CLI 真小白一步一步入手全教程系列:https://www.cnblogs.com/ndos/category/1295752.html 尽量把纷繁的知识,肢解重组成为可以堆砌的知识. ...

  2. Ubuntu 中卸载软件的几种命令

    1.在终端里 apt-get安装的软件:安装软件sudo  apt-get install softname1 softname2softname3--卸载软件 sudo apt-get remove ...

  3. http-server服务跨域设置

    http-server --cors -p 9999 ------------------------------------------------------------------------- ...

  4. 异步 Apex 类

    异步Apex类 一个Apex类可以定义为异步类,用于异步执行. 异步类可以通过多种方式实现: Future注解 批处理 Queueable接口 Schedulable接口 Future注解 使用Fut ...

  5. JDBC-Statement,prepareStatement,CallableStatement的比较

    参考:https://www.cnblogs.com/Lxiaojiang/p/6708570.html JDBC核心API提供了三种向数据库发送SQL语句的类: Statement:使用create ...

  6. 山西WebGIS项目总结

    有一段时间没写blog了,说实话,最近的心态一直在变化,看了一部日剧,回想了这一年所学所见,感觉生活目标变了. 做国土项目这段时间不是很忙,由于数据一直给不到位,时间拖得很久,所以在这期间也在继续学习 ...

  7. Cannot find wrapper assembly for type library "ADODB". in VS2017

    Delete Microsoft ActiveX Data Objects {version} Library and then add it back. After resolving the pr ...

  8. C++基础学习一(基础之基础)

    开篇:做了这么多年的软件,第一次使用博客的方式记录学习过程,之前都是笔记本(都有一摞了),因为之前一直从事的都是.NET的开发工作,对C++知之甚少,但一直想了解C++这门鼻祖级的语言,现在终于下定决 ...

  9. Android i2c-tools移植

    一.下载I2C-tools工具: 最近在移植i2c-tools工具,下载地址:https://i2c.wiki.kernel.org/index.php/I2C_Tools:百度到了wiki中的git ...

  10. Python3编写网络爬虫11-数据存储方式四-关系型数据库存储

    关系型数据库存储 关系型数据库是基于关系模型的数据库,而关系模型是通过二维表保存的,所以它的存储方式就是行列组成的表.每一列是一个字段,每一行是一条记录.表可以看作某个实体的集合,而实体之间存在联系, ...