在这一章,我们来具体聊一聊文件的基本属性,再学习一下如何通配符更有效地操作文件,最后聊一聊Linux中的环境变量。

文件的权限

权限的管理在linux中至关重要,那什么是权限呢?权限就是不同的用户对文件可执行操作的限制,比如一些重要文件只有管理员可以进行操作,而另一些文件是任何人都可以读写的。我们需要通过设置各个用户的权限,防止特定文件被任意操作,以保证系统的安全性。

查看权限 ls

查看权限的方法我们上一章已经示范过了,使用 ls -l 即可查看文件的属性以及文件所属的用户和组:

$ ls -l
total 8
drwxr-xr-x 3 enoch enoch 4096 Nov  7 11:20 folder
-rw-r--r-- 1 enoch enoch   21 Nov 11 07:54 script1.py

文件信息的前10个字符(比如drwxr-xr-x)分别代表了不同的意义,第一位代表文件类型,2~4位代表文件的所有者(owener)对文件的权限,第5~7位代表所有者的同组用户(group)拥有该文件的权限,第8~10位代表其他用户(others)拥有该文件的权限:

File Permissions
  • 第一个字符代表文件类型:[d]是目录,[-]是文件,[l]是链接文件,[b]是装置文件里的可供存储的借口设备,是装置文件里的串行端口设备,例如键盘、鼠标
  • 接下来的字符以三个为一组,用r、w、x三个参数的组合表示,位置不会变:[r]表达可读(read),[w]代表可写(write),[x]代表可执行(execute),[-]表示没有权限。

以script1.py来举例:

-rw-r--r-- 1 enoch enoch 21 Nov 07:54 script1.py

前10个字符的意义:“-”代表这是个文件,“rw-”代表用户可以读和写,“r–“代表组里的人只能读,”r–“代表其他人也只能读。后面的第一个enoch代表这个文件所属的用户,第二个enoch表达这个文件属于的组群。

要注意的是,用户一般就是指你,使用电脑的人。而Group组群是用户的集合。

修改权限 chmod

如果要修改权限,我们可以使用 chmod 这个命令,此命令的修改形式是 chmod <who><what> <file>

比如我们对script1.进行以下的修改:

$ chmod g+w script1.py
$ ls -l
-rw-rw-r-- 1 enoch enoch 21 Nov 11 07:54 script1.py

这个g+w很直白,代表的意思就是group + write,也就是给予同组的人写的权利,chmod的具体参数意义如下:

who:[ u ] 对于User权限的修改,[ g ] 对于Group权限的修改,[ a ] Others权限的修改,[ a ] (all) 所有人权限的修改
what:[ + / – / = ]表达加上、减掉、等于这些权限,[ r / w / x ]表示被修改的权限,也可以将多个权限加起来,比如rwx
file:被操作的文件,可以为多个

操作权限的方式是很灵活多样的:

权限的修改对于我们运行脚本至关重要,在没有修改用户执行权限的情况下,如果我运行script1.py则会得到以下的信息提示:

$ ./script1.py
bash: ./script1.py: Permission denied

但我们给用户加了执行的权限后,我们就能得到正常运行此python3脚本文件了:

这是script1.py的具体内容:

#!/user/bin/python3    #告诉电脑改用什么程序来执行
print("Hello World")

Linux通配符 (Wildcard)

当我们想要一次性操作多个文件时,将目标文件一个一个输入非常麻烦,我们可以用一种很短的文本模式,也是通配符(wildcards),简洁地代表一组路径。接下来我会介绍几个常用的通配符。

?字符

?字符代表单个字符

# 已存文件:a.txt, b.txt
$ ls ?.txt
a.txt b.txt

可以看到 ? 匹配了任何单个字符,所以 a.txt 和 b.txt 都在了 ?.txt 的匹配范围内。如果要匹配多个字符,连用多个 ? 即可:

# 已存文件 a.txt, b.txt, abc.txt, file1.txt, file2.txt
$ ls ???.txt
abc.txt
$ ls file?.txt
file1.txt file2.txt

注意:? 不能匹配空字符,它所占据的位置必须有字符存在。

* 字符

* 代表任意数量的字符

# 已存文件 a.txt, b.txt, abc.txt, file1.txt, file2.txt, script1.py
$ ls *.txt
a.txt b.txt abc.txt file1.txt file2.txt
$ ls * # 输出所有文件

*也是可以匹配空字符的

# 已存文件:a.txt, b.txt
$ ls a*.txt
a.txt

[…]模式

[…]可以匹配括号中任意一个字符,比如匹配的是c,o,d,e四个字母

# 已存文件:a.txt, b.txt
$ ls [ab].txt
a.txt b.txt

[start-end]表示一个连续的范围:

# 已存文件:file1.txt, file2.txt, file3.txt file4.txt
$ ls file[1-3].txt
file1.txt file2.txt file3.txt

{...}模式

{...}表示匹配大括号中的所有模式,模式之间用逗号分隔:

$ echo {a, b, c, d}.txt
a.txt b.txt c.txt d.txt
$ echo {file1, script}.txt
file1.txt script.txt

环境变量

环境变量是一个可变的系统数值,包含一个名字和对应的数值,它能被操作系统中的软件调用,并影响系统中软件的运行。

设置环境变量最重要的作用之一就是简便了我们运维的工作,让我们可以更方便地设置和调用特定路径。比如在我们运行某些软件时,可能需要调用一个特定的文件路径,我们可以直接为创建一个环境变量包含其路径,这样文件路径改变的时候,我们直接重新定义其变量即可。我们也可以通过编辑环境变量来简化软件需要依赖的路径的设置(比如在设定Java路径的时候)。

环境变量分类

按照生命周期分类,Linux环境变量可以分为两类:

  1. 永久环境变量:需要用户修改相关的配置文件,变量永久有效。
  2. 临时环境变量:用户可以使用export命令,在当前终端下声明环境变量,当shell终端被关闭的时候就失效了。

按照作用域来分,Linux环境变量可以分为:

  1. 系统环境变量:系统环境变量对该系统中所有用户都有效。
  2. 用户环境变量:只对特定的用户有效。

环境变量设置方式

如果要查看具体环境变量的内容,我们可以使用echo指令,然后在变量前加上$:

$ echo $PATH

PATH变量指定了我们可运行软件的路径,如果一个软件没有被添加进PATH变量,那么我们是无法直接在Shell中运行此软件的。

如果要设定环境变量,我们可以使用以下的指令:

$ NEW_VARIABLE=new_value
$ echo $NEW_VARIABLE
new_value

如果我加入一些其他的变量到PATH变量中,可以使用以下的指令:

$ PATH=$PATH:<PATH1>:<PATH2>:<PATH3>
$ export PATH

如果要清除环境变量,可以使用unset指令:

$ unset NEW_VARIABLE
$ echo $NEW_VARIABLE

以上的环境变量的生存周期只在当前shell中,如果要添加一些永久性生效的环境变量,则需要将变量添加在 /etc/profile 文件中。比如我们要让系统可以运行java,那么当我们下载完java完之后,可以在/etc/profile中添加以下的环境变量:

export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib

如果只想为单一用户设置变量,那么只要修改 ~/.bash_profile 即可:

$ nano ~/.bash.profile
export CLASSPAHT=./JAVA_HOME/lib;$JAVA_HOME/jre/lib

修改文件后如果想要马上生效,就要运行$ source ~/.bach_profile 不然只能等待用户重新登入时才能生效。

重要环境变量

  • USER: 当前的用户名
  • PWD: 当前的工作文件夹
  • HOME: 指定用户的主工作目录(既目录登入到Linux系统中,默认的目录)
  • HISTSIZE: 指保存历史命令记录的条数
  • LOGNAME: 指当前用户的登录名
  • HOSTNAME: 指主机的名称,许多用户程序如果要用到主机名的话,通常是从这个环境变量中来取得的
  • SHELL: 指当前用户用的是哪种Shell
  • LANG/LANGUGE: 和语言相关的环境变量,使用多种语言可以修改此环境变量
  • TZ: 用户所在的时区
  • MAIL: 指当前用户的邮件存放目录

命令总结

文件权限相关指令

$ ls -l # 查看具体文件信息
$ chmod <who><what> <file_name>
$ chmod g+w script1.py # 给予同组的人写script1.py的权限
$ chmod 777 script1.py # 给予所以人读写和执行script1.py的全部权限

通配符相关指令

$ ls ?.txt # 单字符匹配
$ ls *.txt # 任意字符匹配
$ ls [ab].txt # 可选匹配通配符1
$ ls {a, b, c}.txt # 可选匹配通配符2

环境变量相关指令

$ echo $PATH # 显示某个环境变量值
$ export NEW_VAL="test" # 设置一个新的环境变量 
$ env # 显示所有环境变量 
$ set # 显示本地定义的shell变量
$ unset <Variable_Name> # 清楚环境变量
$ readonly NEW_VAL # 设置只读环境变量

课后练习

将当前文件夹中,为所有以txt为后缀的文件,设置以下的权限:用户可读可写可执行,同组的人可读可写,其他人可读。