我的命令怎么没有了-细讲$PATH
经常有同学问,为什么我的命令没有了,比如cd,pkurun-cnlong等类似的命令没有,甚至ls都不行,什么原因呢,下面我们开始讲解。
这边还是以test_pkuhpc账号为例,路径:/lustre2/teach_pkuhpc/example/linux-shell/PATH
这里涉及到linux系统的环境变量(环境变量通常是全局的),我们先讲讲,
这边还是以test_pkuhpc账号为例,我们可以登录北极星终端,我们可以用export去查看已经设置的变量:
[test_pkuhpc@login12 PATH]$ export
declare -x HISTCONTROL="ignoredups"
declare -x HISTSIZE="18888"
.....
declare -x PATH="......"
这里有个变量declare -x PATH="......" ,这个变量非常重要,系统会根据这个变量,去寻找可执行的命令。
对某个用户环境变量又分为两种
1、一种是临时的,重启后会消失
如在登录所在的终端输入,export PATH="$PATH:/opt/au1200_rm/build_tools/bin",这个仅仅在所在终端生效
2、一种是永久的
修改profile文件:
所有用户(不安全,通常管理员去做)
修 改/etc/profile(对所有用户都是有效的)
#vi /etc/profile
在里面加入:
export PATH="$PATH:/lustre2/teach_pkuhpc/example/linux-shell/PATH"
修改.bashrc文件:
# vi ~/.bashrc
(单独用户)
修改~/.bashrc文件
cd ~
vi .bashrc
在里面加入:
export PATH="$PATH:/lustre2/teach_pkuhpc/example/linux-shell/PATH"
然后,输入source ~/.bashrc 。使其在终端生效
那么我们现在开始测试上面两种情况
1、现在/lustre2/teach_pkuhpc/example/linux-shell/PATH里创建可执行文件:
[test_pkuhpc@login12 PATH]$ echo '#!/bin/bash' >test.run ###这里单引号是不执行命令,只是字符串,>表示创建新文件或者覆盖里面的内容
[test_pkuhpc@login12 PATH]$ echo pwd >>test.run ###这里>>表示追加
[test_pkuhpc@login12 PATH]$ echo hostname >>test.run
[test_pkuhpc@login12 PATH]$ echo date >>test.run
[test_pkuhpc@login12 PATH]$ echo sleep 1 >>test.run
生成的文件
[test_pkuhpc@login12 PATH]$ cat test.run
#!/bin/bash
pwd
hostname
date
sleep 1
更改权限
[test_pkuhpc@login12 PATH]$ chmod u+x test.run ##chmod是更改权限的命令,u是用户,g是组,o是其他组;r是读权限,w是写,x是课执行
[test_pkuhpc@login12 PATH]$ ll
total 4
-rwxrw-r-- 1 test_pkuhpc test_pkuhpc 38 Nov 14 23:30 test.run ##绿色表示可执行
测试程序,需要输入 ./test.run 需要加./因为要告诉系统,在当前路径,否则没有法执行
[test_pkuhpc@login12 PATH]$ ./test.run
/lustre2/teach_pkuhpc/example/linux-shell/PATH
login12
Thu Nov 14 23:35:35 CST 2019
[test_pkuhpc@login12 PATH]$ test.run
bash: test.run: command not found...
那么如何让系统找到程序呢:
1、临时执行
[test_pkuhpc@login12 PATH]$ export PATH="$PATH:/lustre2/teach_pkuhpc/example/linux-shell/PATH"
[test_pkuhpc@login12 PATH]$ test.run
/lustre2/teach_pkuhpc/example/linux-shell/PATH
login12
Thu Nov 14 23:39:21 CST 2019
2、永久执行
[test_pkuhpc@login12 PATH]$ source ~/.bashrc ###先source下恢复下PATH环境设置,否则这个终端还会执行上面跑的环境
[test_pkuhpc@login12 PATH]$ vi ~/.bashrc
[test_pkuhpc@login12 PATH]$ cat ~/.bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
export PATH="$PATH:/lustre2/teach_pkuhpc/example/linux-shell/PATH"
[test_pkuhpc@login12 PATH]$ source ~/.bashrc
[test_pkuhpc@login12 2019test]$ test.run
/lustre1/test_pkuhpc/2019test
login12
Thu Nov 14 23:43:16 CST 2019 ###这里我们可以看到,可以在其他文件夹执行和路径没有关系
[test_pkuhpc@login12 2019test]$
几个容易出问题的地方:
1、export PATH="/lustre2/teach_pkuhpc/example/linux-shell/PATH" 这个结果是,系统只能找到/lustre2/teach_pkuhpc/example/linux-shell/PATH的路径:
[test_pkuhpc@login12 2019test]$ export PATH="/lustre2/teach_pkuhpc/example/linux-shell/PATH"
[test_pkuhpc@login12 2019test]$ ls
bash: ls: command not found...
Similar command is: 'lz'
怎么恢复?
[test_pkuhpc@login12 2019test]$ export PATH=$PATH:/usr/bin:/bin:
[test_pkuhpc@login12 2019test]$ ls
11571736816_.pic_hd.jpg
然后:
[test_pkuhpc@login12 PATH]$ vi ~/.bashrc
改export PATH="/lustre2/teach_pkuhpc/example/linux-shell/PATH"为export PATH="$PATH:/lustre2/teach_pkuhpc/example/linux-shell/PATH"
[test_pkuhpc@login12 PATH]$ source ~/.bashrc
就恢复了
2、如何不使用系统默认的命令,可以把PATH放在后面,系统是按照先后顺序找命令的,如执行gcc8
[test_pkuhpc@login12 2019test]$ export PATH=/appsnew/usr/gcc/gcc-8.3.0/bin:$PATH
[test_pkuhpc@login12 2019test]$ which gcc
/appsnew/usr/gcc/gcc-8.3.0/bin/gcc
通常gcc8的动态库也需要先执行的,所以还需要加入:
export LD_LIBRARY_PATH=/appsnew/usr/gcc/gcc-8.3.0/lib64:$LD_LIBRARY_PATH
这个就可以完整执行gcc8