2011-05-12 185 views
15

我正在嘗試使用script命令記錄bash會話。Bash腳本:使用bash腳本中的「腳本」命令記錄會話

script命令是使用bash腳本執行的,但一旦它執行,bash腳本就會終止。

我試圖用不同的組合總是調用相同的結果(一旦命令被調用就終止bash腳本)。我得到的輸出如下:

Script started, file is typescript 
[email protected]: ... 

我也試圖跟到底,但再沒有運氣的&調用命令。

任何人都可以告訴我如何從bash腳本調用命令嗎?

感謝

+1

請向我們展示您的bash腳本,或者至少是'script'行。 – 2011-05-12 22:22:46

+0

從腳本提示做一個ps(無參數),這應該顯示發生了什麼。你爲什麼認爲它不起作用?如果這是因爲打字稿是「空的」,那麼你正在遭受緩衝。 – cdarke 2011-05-13 13:05:53

+0

@Robin Green:你可以在這裏找到我的腳本:[鏈接](http://pastebin.com/CuAyPfhM) – limp 2011-05-14 14:26:05

回答

16

你的shell腳本並沒有終止。它仍在運行。您正在收到提示,因爲script正在產生新的外殼。

的應用案例script是:

  1. 開始script(產生一個新的shell)
  2. 就命令
  3. 出口外殼(註銷),並下降到以前的shell
  4. 檢查或打印日誌文件由script創建

所以基本上script按預期工作。你將不得不尋找另一種方式來實現你想要的。

,您可以登錄你的腳本是這樣執行:

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

說明:

  • exec > logfile 2>&1重定向輸出和錯誤記錄到logfile
  • set -x使得bash的打印執行它
  • 之前的每一個命令

考試ple:

$ ./foo.sh 
$ cat logfile 
+ FOO=BAR 
+ echo BAR 
BAR 

此方法的缺點是腳本不打印輸出供人看。一切都進入日誌文件。

或者你可以做這樣的:

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

然後執行類似這樣的:

$ script -c "bash -x foo.sh" 
Script started, file is typescript 
+ FOO=BAR 
+ echo BAR 
BAR 
Script done, file 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 
+0

使用BSD腳本命令(MacOS X),你不會使用'-c'參數或引號命令。這將是'script bash -x foo.sh' – 2018-02-16 22:21:14

5

你的bash腳本仍在運行,但它也催生了新的交互的shell。bash腳本正在等待script完成,這隻會在交互式shell被終止時(通過被殺死或者由用戶鍵入exit)發生。

爲了使命令後scriptscript記錄,像這樣做:

script build_log -c 'echo -e "* This line should appear inside the /"build_log/" log file..."' 

然而,script將停止運行命令後運行。

要在script中運行多個命令,請將這些命令放在另一個bash腳本中,並將該bash腳本指定爲要運行到-c選項的命令。

+0

謝謝!這完全是我在找的東西。我做了很多make x,make y等,並在命令行中單獨編寫腳本。我最終使用了一個.sh文件,併爲我的每個make命令調用了'script results1.txt -c「make x」'。很有用! – redhotspike 2013-03-12 19:51:35

+0

使用BSD腳本命令(MacOS X),您不需要命令周圍的「-c」參數或引號。它將會是'script build_log echo'*這行應該出現在「build_log」日誌文件中......「 – 2018-02-16 22:15:59

2

您可以在shell腳本中使用一個技巧來啓動腳本或不啓動它。基於一個特殊的參數,它可以選擇使用一個特殊的參數來執行它,以便腳本不會再次啓動。

這應該最有可能的解釋我的意思:

if [ "$1" != "noscript" ] ; then 
     # execute self with the noscript special arg so that the second execution DOES NOT start script again. 
     exec script -q -c "$0 noscript $1 $2 $3" /build/buildlog_`date '+%Y%m%d%H%M%S'`.log 
     echo Problem in $0, please check. 
     exit 1; 
fi 
...Rest of the script should follow here. 

我已經試過這一點,它工作得很好。除非你特別關注那些需要傳遞的參數以及腳本計劃被惡意用戶使用,否則這應該就足夠了:)。

3

以下的execve的想法,你也可以使用一個環境變量:

#!/bin/sh 
[ -z "$TYPESCRIPT" ] && TYPESCRIPT=1 exec /usr/bin/script -c "TYPESCRIPT=1 $0 [email protected]" 
# your script here... 
1

朱傑的答案是偉大的,但不能正確地傳遞參數。基本問題是在雙引號字符串中使用[email protected]$*應該使用:

#!/bin/sh 
[ -z "$TYPESCRIPT" ] && TYPESCRIPT=1 exec /usr/bin/script -c "TYPESCRIPT=1 $0 $*" 
# your script here... 

這裏與[email protected]會發生什麼:

foo.sh

#!/bin/sh 
if [ -z $FOO ] 
then 
    FOO=1 exec $0 [email protected] 
else 
    ./echo_args.sh "$0 [email protected]" 
fi 

bar.sh

#!/bin/sh 
echo 0 $0 
echo 1 $1 
echo 2 $2 
echo 3 $3 

現在./foo.sh with some arguments輸出

0 ./bar.sh 
1 /path/to/foo.sh with 
2 some 
3 arguments 

這會導致一些參數傳遞給script,而不是到foo.sh第二次執行。