PS1更改的Linux脚本命令

时间:2017-03-16 14:22:01

标签: linux bash shell ps1

在这里看到一篇帖子:Change PS1 after running the 'script' command但它似乎没有回答这个问题。

我正在尝试让脚本运行“script”命令,并更改提示符(PS1)以指示shell现在已编写脚本。基本上,普通PS1中的“[UNSCRIPTED]”为红色,以便评估员知道他们没有使用脚本窗口。一旦他们准备好进行评估,他们就会运行这个脚本,窗口现在会被编写脚本,并且提示会改变以表明这一点。

现在,如果您逐个粘贴命令但是当尝试将它们放入脚本时,它是行不通的,因为“script”命令启动一个新进程,因此PS1更改将仅适用于父进程( shell脚本是从中运行的,并且在退出“脚本”进程之前不会生效。

我尝试了许多后台编写脚本过程(&)的变体,按顺序运行命令(;和&&)但是那些仍然等待父进程(脚本命令)完成后再继续。

以下是逐行运行(复制/粘贴)但无法在shell脚本中运行的命令:

script -af /opdata/logs/scripted/script.$$

# SETUP WINDOW ENVIRONMENT
PS1='\d \t \u@\h \[\e[38;5;33m\]\w \[\e[0m\]# '
date -u
date
hostname
ifconfig -a
netstat -nr
uname -a

3 个答案:

答案 0 :(得分:1)

你可以运行

script -af /tmp/script.out -c "export PS1='\d \t \u@\h \[\e[38;5;33m\]\w \[\e[0m\]# '; date -u; date; hostname; ifconfig -a; netstat -nr; uname -a; bash --norc"

运行bash而不解析任何rc文件,因此导出的PS1不会更改。

答案 1 :(得分:1)

您可以尝试使用bash脚本中的命令(比如说scbash.sh):

script -a /opdata/logs/scripted/script.$$ bash --init-file <(cat <<'EOF'
#these commands will run BEFORE the scripted bash goes interactive
PS1='SCRIPTED >'
ls
date
EOF
)

运行scbash.sh,您将获得

Script started, output file is ....
#ls output
#date output
SCRIPTED >  #< as prompt
...
#interactive scripted bash here using a prompt 'SCRIPTTED >'
exit
Script done, output file is...

script完成后...您将继续使用原始PS1

答案 2 :(得分:1)

另一种选择是使用init命令创建一个文件,例如.scriptrc

# SETUP WINDOW ENVIRONMENT
PS1='\d \t \u@\h \[\e[38;5;33m\]\w \[\e[0m\]# '
date -u
date
hostname
ifconfig -a
netstat -nr
uname -a

然后让你的脚本命令调用bash并使用--rcfile参数在启动时读取该文件:

script -af /opdata/logs/scripted/script.$$ -c 'bash --rcfile ${HOME}/.scriptrc'