Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
454 views
in Technique[技术] by (71.8m points)

linux - Bash script: Using "script" command from a bash script for logging a session

I am trying to use script command for logging a bash session.

The script command is executed from withing a bash script but as soon as it is executed, the bash script terminates.

I have tried to invoke the command using various combination always with the same result (termination of the bash script as soon as the command is called). The output that I get is the following:

Script started, file is typescript
root@ubuntu: ...

I have also tried to invoke the command with an & in the end but again with no luck.

Can anyone tell me how should I invoke the command from a bash script?

Thanks

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Your shell script did not terminate. It is still running. You are getting a prompt because script is spawning a new shell. the prompt you see is the prompt from the spawned shell.

The normal use case for script is something like this:

  1. start script. this spawns a new shell.
  2. do commands in the new shell.
  3. exit the shell and drop to previous shell
  4. examine the logfile created by script

So basically script is working as expected. You will have to find another way to achieve what you want.

You can log the execution of your script like this:

#! /bin/bash
exec > logfile 2>&1
set -x
FOO=BAR
echo $FOO

Explanation:

  • exec > logfile 2>&1 redirects stdout and stderr to logfile
  • set -x makes bash print every command before executing it

Example:

$ ./foo.sh
  # (no output here because everything goes to logfile)
$ cat logfile 
+ FOO=BAR
+ echo BAR
BAR

Disadvantage of this method is that the script prints no output for humans to see. Everything goes to the logfile.

Alternatively you can do it like this:

#! /bin/bash
# nothing special here
FOO=BAR
echo $FOO

Then execute like this:

$ script -c "bash -x foo.sh"
Script started, file is typescript
+ FOO=BAR
+ echo BAR
BAR
Script done, file is typescript

now output is directly visible and also saved to logfile (default name of logfile is typescript)

$ cat typescript 
Script started on Mi 18 Mai 2011 01:05:29 CEST
+ FOO=BAR
+ echo BAR
BAR

Script done on Mi 18 Mai 2011 01:05:29 CEST

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...