修改SHELL变量失败后,bash无视后续的命令, 直接停止脚本进程
源代码如下
#!/bin/bash
set -r
SHELL="/bin/sh"
echo "\$SHELL=$SHELL"
谢谢
set(选项)(参数)
选项
-a:标示已修改的变量,以供输出至环境变量。
-b:使被中止的后台程序立刻回报执行状态。
-C:转向所产生的文件无法覆盖已存在的文件。
-d:Shell预设会用杂凑表记忆使用过的指令,以加速指令的执行。使用-d参数可取消。
-e:若指令传回值不等于0,则立即退出shell。
-f:取消使用通配符。
-h:自动记录函数的所在位置。
-H Shell:可利用"!"加<指令编号>的方式来执行history中记录的指令。
-k:指令所给的参数都会被视为此指令的环境变量。
-l:记录for循环的变量名称。
-m:使用监视模式。
-n:只读取指令,而不实际执行。
-p:启动优先顺序模式。
-P:启动-P参数后,执行指令时,会以实际的文件或目录来取代符号连接。
-t:执行完随后的指令,即退出shell。
-u:当执行时使用到未定义过的变量,则显示错误信息。
-v:显示shell所读取的输入值。
-x:执行指令后,会先显示该指令及所下的参数。
或者你想用的是sed这个命令?
sed[-nefri] ‘command’ 输入文本
常用选项:
-n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e∶直接在指令列模式上进行 sed 的动作编辑;
-f∶直接将 sed 的动作写在一个档案内, -ffilename 则可以执行 filename 内的sed 动作;
-r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
-i∶直接修改读取的档案内容,而不是由萤幕输出。
常用命令:
a∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
s∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
改好了试试追问
抱歉,set是有 -r 选项的,据我所知,该选项常用于在执行bash脚本时打开Shell的限制模式。
gnu bash 4.4.19
代开shell的限制模式是-r 但是是bash的 -r选项 即以“bash -r”方式来运行bash,在该模式下,bash的功能受到许多限制,如:不能使用cd命令、不能设定或取消环境变量、不能做输入输出的重定向等操作。你的其他并无问题如果你对set有疑问建议打help set看一下
[root@localhost ~]# help set
set: set [--abefhkmnptuvxBCHP] [-o option-name] [arg ...]
Set or unset values of shell options and positional parameters.
Change the value of shell attributes and positional parameters, or
display the names and values of shell variables.
Options:
-a Mark variables which are modified or created for export.
-b Notify of job termination immediately.
-e Exit immediately if a command exits with a non-zero status.
-f Disable file name generation (globbing).
-h Remember the location of commands as they are looked up.
-k All assignment arguments are placed in the environment for a
command, not just those that precede the command name.
-m Job control is enabled.
-n Read commands but do not execute them.
-o option-name
-p Turned on whenever the real and effective user ids do not match.
Disables processing of the $ENV file and importing of shell
functions. Turning this option off causes the effective uid and
gid to be set to the real uid and gid.
-t Exit after reading and executing one command.
-u Treat unset variables as an error when substituting.
-v Print shell input lines as they are read.
-x Print commands and their arguments as they are executed.
-B the shell will perform brace expansion
你说的我知道,但我想问的是
echo "\$SHELL=$SHELL"
这句没有执行是怎么回事。
这个并没有问题我运行过了可能因为你前面就已经报错了前面报错后面肯定执行不了了,不如你把报错的内容贴上来,或者把前面那一句set -r 给去掉,在执行,这个执行后的结果就是$SHELL=/bin/sh
追问我记得你说的"前面报错后面就执行不了"只限于出现的是语法错误吧,但这个脚本我没发现有语法错误啊
追答因为脚本就是这样啊,你脚本错误就会抛出异常就终止了如果你要想错误还继续执行就要写异常捕捉,然后处理你应该是新手吧建议先去看看书,比如鸟哥的私房菜