2017-03-16 105 views
2

在这里看到一个帖子:Change PS1 after running the 'script' command但它似乎没有回答这个问题。Linux脚本命令与PS1更改

我想要一个脚本运行“脚本”命令,并更改提示(PS1)以表明该shell现在是脚本。基本上,正常的PS1的红色部分是“[UNSCRIPTED]”,因此评估者知道他们没有使用脚本窗口,一旦他们准备好进行评估,他们就会运行这个脚本,现在窗口会被编写脚本,提示会改变,以指示这种情况

现在,如果您逐个粘贴命令,但尝试将它们角色到脚本中时不起作用,因为“脚本”命令会启动新过程,所以PS1更改将仅适用于父进程(shell脚本从此运行),并且在退出“脚本”进程之前不会生效。

我已经尝试了许多变体的后台脚本过程(&),运行命令顺序(;和& &),但在继续前,所有这些都仍然等待父进程(脚本命令)完成。

下面是一行(复制/粘贴),如果跑线上工作的命令,但我不能得到一个shell脚本工作:

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

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

回答

1

您可以运行

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

比运行bash没有解析任何rc文件,所以导出的PS1没有改变。

+0

我遇到了使用-c标志的问题,因为在运行我的命令后脚本会关闭,我不认为运行bash作为最终命令。 –

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

1

另一种选择是创建,例如你的初始化命令的文件.scriptrc

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

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

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