Linux的PS1.PS2.PS3.PS4等环境变量;Crontab的两个坑人点;变量传
1.问题出现:
我为了实现一个功能,就是让PS1变量(命令行提示符)每隔1分钟(利用crontab计划任务)变化一次颜色和背景格式以实现酷炫的效果,但是经过了各种尝试均以失败告终。虽然能够实现让PS1每按一次回车变化一次颜色(这个有人想尝试的话下面写的有),但是无法做到让它每隔一段时间进行一次格式的变化 附加:PS1每按一次回车实现颜色变化实现:
注意点:
11:01[[email?protected] /data/scriptest]# echo $PS1 33[01;$[RANDOM%7+31]mA[[email?protected]h w]$ 33[0m
2.以下是问题的分析和总结:环境变量
20:59[[email?protected] /data/scriptest]# declare -x aaa=12345 20:59[[email?protected] /data/scriptest]# echo $aaa 12345 20:59[[email?protected] /data/scriptest]# ./testsource2.sh 12345 123123 20:59[[email?protected] /data/scriptest]# echo $aaa 12345
没定义local 21:01[[email?protected] /data/scriptest]# echo $aaa 12345 21:01[[email?protected] /data/scriptest]# funsor() { aaa=555 ; return 0 ; } 21:02[[email?protected] /data/scriptest]# echo $aaa 12345 21:02[[email?protected] /data/scriptest]# funsor 21:02[[email?protected] /data/scriptest]# echo $aaa 555 定义local 21:08[[email?protected] /data/scriptest]# echo $aaa 12345 21:08[[email?protected] /data/scriptest]# funsor2() { local aaa=555 ; echo $aaa ; return 0 ; } 21:08[[email?protected] /data/scriptest]# funsor2 555 21:08[[email?protected] /data/scriptest]# echo $aaa 12345 特别注意点(目前测试过的,下面有测试过程A和B):
而能够被这个子shell直接继承的有(基本上在开机后shell开启后用declare -x命令查看到的这些出现的变量都能够继承):
不能够被直接继承的有:
测试过程A:PS的继承变量的测试(可先把下面的分析看完再回头看):
#!/bin/bash echo PS1=$PS1 echo PS2=$PS2 echo PS3=$PS3 echo PS4=$PS4 select i in test1 test2 test3; do case $i in *) echo $i break ;; esac done
12:10[[email?protected] /data/scriptest]# . PStest PS1=[ 33[01;35m]A[[email?protected]h w]$[ 33[00m] PS2=> PS3= PS4=+ 1) test1 2) test2 3) test3 #? 2 test2 12:10[[email?protected] /data/scriptest]#
12:15[[email?protected] /data/scriptest]# declare -x PS1 PS2 PS3 PS4 12:15[[email?protected] /data/scriptest]# declare -x : 查看 declare -x PS1="[ 33[01;35m]A[[email?protected]h w]$[ 33[00m] " declare -x PS2="> " declare -x PS3 declare -x PS4="+ "
12:15[[email?protected] /data/scriptest]# PStest PS1= PS2= PS3= PS4=+ 1) test1 2) test2 3) test3 #? 1 test1 12:17[[email?protected] /data/scriptest]#
12:21[[email?protected] /data/scriptest]# PS3="Please input" 12:22[[email?protected] /data/scriptest]# PS4="=== " 12:22[[email?protected] /data/scriptest]# declare -x declare -x PS1="[ 33[01;35m]A[[email?protected]h w]$[ 33[00m] " declare -x PS2="> " declare -x PS3="Please input" declare -x PS4="=== "
12:22[[email?protected] /data/scriptest]# PS1test.sh 12:24[[email?protected] /data/scriptest]# PStest PS1= PS2= PS3=Please input PS4=+ 1) test1 2) test2 3) test3 Please input3 test3 测试过程B:下面是测试可以被子shell直接继承的由shell本身默认定义的变量的一些测试过程:先写脚本,然后以子shell方式进行测试: 21:36[[email?protected] /data/scriptest]# cat testsource.sh -n 1 #!/bin/bash 2 echo PATH=$PATH 3 echo PWD=$PWD 4 echo HOSTNAME=$HOSTNAME 5 echo HISTSIZE=$HISTSIZE 6 echo HISTCONTROL=$HISTCONTROL 7 21:36[[email?protected] /data/scriptest]# ./testsource.sh PATH=/data/app/httpdnew/bin:/data/app/cmatrix/bin:/data/app/tree/bin:/data/scriptest/:.:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin:/root/bin PWD=/data/scriptest HOSTNAME=centos7.6test HISTSIZE=1000 HISTCONTROL=ignoreboth crontab的两个坑人注意点:%和环境变量crontab的执行过程它的执行过程比较特殊,它执行的时候并不会从当前shell中继承各种系统定义的环境变量和自己定义的环境变量(全局变量)等等,因此必须在它执行的时候传递给它各种环境变量才能保证后的命令完全正确的执行。分情况分析:
从上面可见crontab几乎不会继承任何变量,不论是系统定义的还是自己定义的,不论是环境还是普通变量,不论是内存中的还是文件中的。
需要注意点:
21:37[[email?protected] /data/scriptest]# cat /etc/crontab //就是按照下面这3行的格式来定义自己需要的环境变量 SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed source的简单说明source的命令其实很简单,就相当于是在当前的shell中执行文件中的命令(把文件中的每一行命令拉到命令行来执行),类似于函数,因此它能够改变当前shell的环境变量等等。 3.问题的结论:从上面分析得知,不论怎样都无法在子shell中修改环境变量(包括PS1)的值并传给父shell,而crontab默认开启子shell,因此它不仅改不了PS1,其他的环境变量也无法应用到父shell中,就算用source命令也只是在crontab开启的子shell中应用这些环境变量,不能修改它们传递到父shell也就是当前shell中。
更多分析:
crontab的%的说明这个在crontab中代表换行,想要使用它要么%转义的方式,要么就把它写入脚本中,或者写在单引号中不需要转义,不过此时就不能用于计算取余或者字符串变量操作中的一些命令了。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |