2017-03-16 5 views
2

J'ai vu un article ici: Change PS1 after running the 'script' command mais cela n'a pas semblé répondre à la question.Commande de script Linux avec changement PS1

J'essaye d'avoir un script exécutant la commande "script" et change également l'invite (PS1) pour indiquer que le shell est maintenant scripté. Fondamentalement, la PS1 normale est "[UNSCRIPTED] dedans en rouge pour que l'évaluateur sache qu'ils n'utilisent pas une fenêtre scriptée, une fois qu'ils seront prêts à faire leur évaluation, ils exécuteront ce script, la fenêtre sera maintenant scriptée, et Maintenant, cela fonctionne si vous collez les commandes une par une, mais lorsque vous essayez de les jouer dans un script ne fonctionne pas parce que la commande "script" démarre un nouveau processus de sorte que la PS1 La modification s'appliquera uniquement au processus parent (le script shell a été exécuté) et ne prendra effet qu'à la fin du processus "script"

J'ai essayé plusieurs variantes d'arrière-plan du processus de script (&). commandes en séquence (; et & &) mais tous attendent toujours que le processus parent (la commande de script) se termine avant de poursuivre.

Voici les commandes qui fonctionnent si la ligne RAN par ligne (copier/coller), mais je ne peux pas travailler dans un script 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 

Répondre

1

Vous pouvez exécuter

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" 

Than runs le bash sans analyser les fichiers rc et donc la PS1 exportée n'est pas modifiée.

+0

J'avais un problème en utilisant l'option -c parce que le script se fermait après l'exécution de mes commandes, je ne pensais pas exécuter bash comme dernière commande. –

1

Vous pouvez utiliser les commandes dans un script bash (laisser dire scbash.sh) comme:

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 
) 

Run scbash.sh et vous obtiendrez

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... 

lorsque le script obtenir fini ... vous continuerez avec votre original PS1.

1

Une autre option est de créer un fichier avec vos commandes d'initialisation par exemple .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 

Faites ensuite votre commande de script bash d'appel avec le paramètre --rcfile pour lire ce fichier au démarrage:

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