相对路径与绝对路径:
绝对路径:路径的写法一定由根目录 / 写起,例如 /usr/share/doc 这个目录;
相对路径:不是由 / 写起,例如由 /usr/share/doc 到 /usr/share/man 下这个目录,可以写 cd ../man。指的是当前工作目录下的路径。
目录的相关操作
一些特殊的目录,可以帮助我们快速操作:
. 代表此层目录
.. 代表上层目录
- 代表前一个工作目录
~ 代表“目前用户身份”所在的主文件夹
~YXH 代表“YXH”这个用户的主文件夹(YXH是个账户名称)
#要注意,根目录下其实也有“.”和“..”目录,但是仔细去看发现,都指向的是自己
介绍一些简单的命令:
- cd(Change Directory)
[root@VM_174_157_centos ~]# cd [相对路径或绝对路径]
实例:
[root@VM_174_157_centos ~]# cd ~
[root@VM_174_157_centos ~]# cd /var/spool/mail
#cd是 Change Directory 的缩写,用来切换工作目录。多用[Tab]快速补齐可以避免打错,是一个好的习惯。
- pwd(Print Working Directory)
#输出当前工作目录
[root@VM_174_157_centos ~]# pwd
#显示实际的工作目录,而非文件本身的目录名
[root@VM_174_157_centos ~]# pwd
/var/mail
[root@VM_174_157_centos ~]# pwd -P
/var/spool/mail <== 加了-P发现不一样
[root@VM_174_157_centos ~]# ls -ld /var/mail
lrwxrwxrwx 1 root root 10 Sep 4 17:54 /var/mail -> spool/mail
#看到这里应该知道原因了吧,因为/var/mail是连接文件,链接到/var/spool/mail
#所以加上pwd -P后,会不以连接文件的数据显示,而是正确的完整路径
- mkdir(make directory):即使目录本来就存在,系统也不会显示错误信息
这里写代码片[root@VM_174_157_centos ~]# mkdir [-mp] 目录名称
选项与参数:
-m:配置文件案的权限!直接设定,不需要看默认权限(umask)
-p:帮助你直接将所需要的目录(包含上层目录)递归创建起来
#创建新目录
[root@VM_174_157_centos ~]# cd /tmp
[root@VM_174_157_centos tmp]# mkdir test
[root@VM_174_157_centos tmp]# mkdir test1/test2/test3/test4
mkdir:cannot create directory 'test1/test2/test3/test4': No such file or directory
[root@VM_174_157_centos tmp]# mkdir -p test1/test2/test3/test4
#加了这个-p选项,可以自行帮你建立多层目录
- rmdir(remove directory):仅能删除空的目录
[root@VM_174_157_centos ~]# rmdir [-p] 目录名称
参数:
-p:连通上层空的目录也一起删除
[root@VM_174_157_centos ~]# rmdir test1
rmdir: 'test1': Directory not empty
#同理,-p可以递归删除
关于执行文件路径的变量:$PATH
在了解FHS之后,我们知道查看文件属性的命令 ls 的完整文件名为:/bin/ls(这是绝对路径),我们之所以在任何目录下输入ls都可以执行,而不会提示找不到该指令,就是有环境变量PATH的帮助。
当我们执行一个命令,比如说 ls ,系统会依照PATH的设定去每个PATH定义的目录下搜寻文件名为 ls 的可执行文件,如果PATH定义的目录中含有多个文件名为 ls 的可执行文件,那么先搜寻到的同名指令先被执行。
我们可以通过echo $PATH
来查看哪些目录被定义了:
#先用root身份搜索
[root@VM_174_157_centos ~]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
#再用YXH身份搜索
[root@VM_174_157_centos ~]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin
PATH(一定是大写)这个变量的内容是一堆目录,用冒号隔开,每个目录是有顺序的。通过上面的,我们可以看到,无论是root还是其他的账户,都有bin这个目录在PATH 变量内,当然可以执行。
- 1.请问我们能不能用一般身份使用者下达ifconfig eth0 这个指令?
如上面所示,用YXH这个行号执行ifconfig时,会出现[-bash: ifconfig: command not found]
的字样,因为这个命令是放在/sbin下面的,但是YXH的PATH没有设置,所以无法执行。
但是我们同样可以通过[/sbin/ifconfig eth0]
这个命令来执行,绝对路径也是可以的嘛!
- 2.假如你是root,如果你将 ls 由/bin/ls 移动成为 /root/ls ,然后你自己也在/root目录下,请问(1)你能不能通过直接输入ls来执行?(2)若不能,你该如何执行 ls 这个指令?(3)如要直接输入 ls 即可执行,又该如何执行?
(1)当我们移动了之后,无论你在哪个目录下输入都没有办法顺利执行了。因为/root这个目录不在PATH指定的目录中。
(2)因为 ls 是确实存在的,只是位子变了,所以我们可以通过绝对路径来执行这个文件名,如下所示:
[root@VM_174_157_centos ~]# /root/ls
[root@VM_174_157_centos ~]# .ls <==因为在/root目录下,所以直接用.ls指定
(3)如果想让root在任何目录都执行,只需要将/root加入PATH当中即可。加入方法如下:
[root@VM_174_157_centos ~]# PATH="$PATH":/root
- 3.为什么PATH查询的目录不加入本目录(.)?
如果在PATH中加入本目录(.)后,确实我们就能够在命令所在目录进行命令的执行了。但是由于你的工作目录并非固定(经常会使用cd来切换到不同的目录),因此能够执行的命令会有所变动,这并不是什么好事。
另外,如果有不怀好心的用户在/tmp下做了一个命令,因为/tmp是大家都可以写入的环境。假如这个命令可以窃取用户的一些数据,当你用root去执行这个命令,岂不是很可怕。如果它将名称改为经常用到的 ls 时,那就更惨了。