在这里看到一篇帖子: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
答案 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'