环境变量与文件查找
环境变量
Shell中的变量有类型但不用专门指定类型名,属于弱类型编程语言,可参与运算也有变量的作用域。
declare temp //用declare预先声明一个变量
也可以不用声明,直接即用即创建,像python变量一样:
temp=shiyanlou //直接给变量赋值,等号两边不能有空格
echo $temp //读取变量的值,要注意变量前的$符号,新手容易忘
变量名与其他编程语言的变量一样,变量名只能是英文字母、数字或者下划线,且不能以数字作为开头。
环境变量的作用域比自定义变量的要大,如 Shell 的环境变量作用于自身和它的子进程。每个进程都有自己的环境变量设置,在默认情况下,当一个进程被创建时,除了创建过程中明确指定的话,它将继承其父进程的绝大部分环境设置,终端的 Shell 中运行的大部分命令(如cat,cd等)都将以 Shell 的子进程的方式运行。
通常涉及的变量有三种:
- 当前shell中用户自定义的变量,如上面的temp变量,其只在当前shell窗口有效
- Shell本身有很多内建的变量
- 自定义的变量导出的环境变量
也有三个与上述三种环境变量相关的命令:set
,env
,export
。这三个命令很相似,都是用于打印环境变量信息,区别在于涉及的变量范围不同。
关于哪些变量是环境变量,可以简单地理解成在当前进程的子进程有效则为环境变量,
export temp //将自定义的temp变量导出为环境变量
导出为环境变量后,该变量在不同的子shell中仍然有效(类似于当前进程的一个全局变量)
但是关闭当前的 shell 之后,环境变量就没了。怎么才能让环境变量永久生效呢?
按变量的生存周期来划分,Linux 变量可分为两类:
- 永久的:需要修改配置文件,变量永久生效;
- 临时的:使用 export 命令行声明即可,变量在关闭 shell 时失效。
两个重要文件,/etc/bashrc
(存shell变量,有的Linux没有这个文件)和/etc/profile
(存环境变量),另外每个用户目录下的一个隐藏文件.profile
,隐藏文件可以用ls -a
查看,修改.profile
只对当前用户永久有效,修改/etc下的文件(位于根目录/)则对所有用户永久有效。
命令的查找路径与顺序
我们在 Shell 中输入一个命令,Shell 是怎么知道去哪找到这个命令然后执行的呢?这是通过环境变量 PATH 来进行搜索的,PATH 里面就保存了 Shell 中执行的命令的搜索路径(环境变量一般用大写字母来表示)。
echo $PATH //查看环境变量的内容
一般显示的路径都是存放可执行文件的路径,当我们在 Shell 中执行一个命令时(如cat),系统就会按照 PATH 中设定的路径按照顺序依次到目录中去查找,如果存在同名的命令,则执行先找到的那个。
接下来我们创建一个shell脚本,
gedit hello_shell.sh
在文件中添加内容(第一行不可省,这不是注释),
#!/bin/bash
for ((i=0; i<10; i++));do
echo "hello shell"
done
exit 0
为文件添加可执行权限:
chmod 755 hello_shell.sh
当前目录下执行脚本,
./hello_shell.sh
如果将该脚本移动到其它目录下(如/home/shiyanlou/mybin
),则再运行./hello_shell.sh
会出错,除非加上命令的完整路径,但那样很不方便,如何做到像使用系统命令一样执行自己创建的脚本文件或者程序呢?那就要将命令所在路径添加到 PATH 环境变量了。
添加自定义路径到PATH环境变量
在环境变量PATH末尾添加自定义路径,路径之间用:
分割,
PATH=$PATH:/home/shiyanlou/mybin (一定要用绝对路径)
这样就可以在任意目录执行那两个命令了(注意需要去掉前面的./
),但这样我们一旦退出终端,再打开发现又失效了。有没有方法让添加的环境变量全局有效?或者每次启动 Shell 时自动执行上面添加自定义路径到 PATH 的命令?后一种方式的实现——让它自动执行。
用户目录下有一个 Shell 每次启动时会默认执行一个配置脚本,以初始化环境,包括添加一些用户自定义环境变量等等,zsh
的配置文件是 .zshrc
,相应 Bash
的配置文件为 .bashrc
。它们在 etc 下还都有一个或多个全局的配置文件,不过我们一般只修改用户目录下的配置文件。
可以直接将内容添加到.zshrc
中:
echo "PATH=$PATH:/home/shiyanlou/mybin" >> .zshrc
上述命令中>>
表示将标准输出以追加的方式重定向到一个文件中,注意前面用到的 >
是以覆盖的方式重定向到一个文件中,在指定文件不存在的情况下都会创建新的文件。
修改已有变量
变量的修改方式:
path=$PATH
path=${path%/home/shiyanlou/mybin} //从尾向前删/home/shiyanlou/mybin
或这可以使用通配符,*表示任意多个任意字符
path=${path%*/mybin} //与上面效果一样
变量删除
unset temp //删除一个环境变量
让环境变量立即将生效
我们在 Shell 中修改了配置脚本文件之后(比如 zsh 的配置文件 home 目录下的 .zshrc
),每次都要退出终端重新打开甚至重启主机之后其才能生效,很是麻烦,我们可以使用source
命令来让其立即生效,如:
source .zshrc //要在当前文件目录下使用
source命令还有一个别名就是.
,上面的命令如果替换成.
的方式就该是:
. ./.zshrc
搜索文件
Linux中一切皆文件
-
whereis 简单快速
whereis cat //搜索cat文件
whereis搜索速度快,其直接在数据库中查询,但只能搜索二进制文件(-b),man 帮助文件(-m)和源代码文件(-s) -
locate 快而全
通过“ /var/lib/mlocate/mlocate.db ”
数据库查找,不过这个数据库也不是实时更新的,系统会使用定时任务每天自动执行updatedb
命令更新一次,所以有时候你刚添加的文件,它可能会找不到,需要手动执行一次updatedb
命令。它可以用来查找指定目录下的不同文件类型,如查找/etc
下所有以sh
开头的文件:
sudo apt-get update
sudo apt-get install locate
locate /bin/sh //它不只是在/bin 目录下查找,还会自动递归子目录进行查找。
locate /usr/share/\*.jpg //查找 /usr/share/ 下所有 jpg 文件
注意要添加 * 号前面的反斜杠转义,否则会无法找到。 -
which 小而精
which本身是 Shell 内建的一个命令,我们通常使用 which 来确定是否安装了某个指定的软件,因为它只从 PATH 环境变量指定的路径中去搜索命令:
which cat
-
find 精而细
内容太多记不住。
小程序
黑客帝国电影里面的数字雨
sudo apt-get update
sudo apt-get install cmatrix
Cmatrix //即可显示