script & scriptreplay

script是什麼


scirpt就是一個命令,能夠製做一份記錄輸出到終端的記錄。對於那些想要真實記錄終端會話的人來講,這頗有用。該記錄能夠保存並在之後再打印出來。typescript

怎麼用shell

默認狀況下,咱們能夠經過在終端中輸入script來啓動scirpt命令。bash

pungki@dev-machine:~$ script
Script started, file is typescript
pungki@dev-machine:~$

你也能夠指定目標文件名來記錄打印結果。session

pungki@dev-machine:~$ script myfile

當你再次見到命令提示符,這意味着終端將記錄打印到終端的任何東西。app

你會看到當前目錄,有個名爲myscript的文件。(LCTT譯註,此處原文有誤。這裏指定了記錄文件名爲myfile,而不是默認的 typescript。)
爲何咱們要用script命令編輯器

由於在以前已經提到過,script命令的主要功能是記錄全部的東西。下面給出了兩個使用該命令的場景。
和同事共事時ui

當和同事一塊兒工做時,咱們能夠經過script來記錄你的活動。命令行

好比,咱們會使用名爲collaborate的打印文件,來完成打印:日誌

$ script collaborate

而後,在完成一些任務後,假如你須要把你幹的活發給另一個工程師,那就把那文件發給他。因此當另一個工程師須要複查所作的事情,他只要用文本編輯器打開這個文件就好了。code

若是他想要更新該文件(以增長他的工做部分),可使用-a選項。

$ script -a collaborate

記錄某人在終端中的所做所爲

你可能讓你的工程師或者某我的遠程訪問你的系統,要確保你的工程師正在幹正確的事,你能夠記錄下他在你係統上的所做所爲。要讓script命令在登陸時自動運行,咱們能夠把它添加進shell環境配置文件中。若是你正在使用bash shell,把這一行加進你的bash環境配置文件中。

$ vi ~/.profile
 
# run the script command to record everything
# use -q for quite and -a option to append the script
#
/usr/bin/script -qa /usr/local/script/log_record_script

而後保存。下次他登陸進你的系統時,script命令就會自動運行,並把日誌記錄進/usr/local/script/logrecordscript。

-q選項可讓scirpt命令以靜默模式運行,登陸進來的用戶不會知道script命令已經運行了。而-a選項將會讓記錄附加到文件中,而不會擦除先前的記錄。

若是不使用-q選項,那麼當用戶登陸進來時,他會收到像下圖中這樣的通知。

退出記錄

要退出記錄活動,咱們能夠在終端中按下Ctrl+D,或者輸入exit。在退出script前,你會發現記錄文件的大小爲0 Kb,而在退出以後,文件大小會發生改變。
結尾

Script命令在你須要記錄或者存檔終端活動時可能頗有用,記錄文件會存儲爲文本文件,因此能夠很方便地用文本編輯器打開。跟日常同樣,咱們均可以經過輸入man script或者scirpt -h來顯示幫助頁並查看更多詳細用法。


在書上看到兩個頗有趣的命令——scriptsrciptreplay,它能夠把終端會話記錄到一個文件中,便是說咱們能夠經過終端會話來來製做命令行技巧視頻教程,也能夠與他人分享會話文件,並且生成的文件還只是通常的文本文件,文件的大小很是小,真是很是有意思。下面是本人寫的兩個shell程序,來方便進行這個有趣並有意義的操做。

1、實現代碼

文件:Record.sh

代碼以下:

#! /bin/bash 
# Filename:Record.sh 
 
read -p "Please input the sesson filename you want to creat: " filename; 
 
sesfile="$filename.session" 
logfile="$filename.timing.log" 
 
if [ -e $sesfile ];then 
    echo "$sesfile is Exsit,Creat session file fault!"; 
    read -p "If you want to reload the file? [Y/N]: " flag; 
    if [ "$flag" = "Y" ];then 
        rm $sesfile $logfile; 
        script -t 2> $logfile -a $sesfile; 
    else 
        echo "Nothing to do!"; 
    fi 
 
else 
    script -t 2> $logfile -a $sesfile; 
fi

文件:Replay.sh

代碼以下:

#! /bin/bash 
# Filename:Replay.sh 
 
read -p "Please input the session filename: " filename 
logfile="$filename.timing.log" 
sesfile="$filename.session" 
if [ -e $sesfile ]; then 
    scriptreplay $logfile $sesfile 
    echo 
else 
    echo "$filename is NOT Exsit!" 
fi

2、程序分析

首先來講說這兩個文件分別是用來幹什麼的吧,Record.sh是用來記錄你所執行的命令和屏幕的輸出的,而Replay.sh是用來回放Record.sh所錄製的內容的。

在Record.sh中,首先要求你輸入一個用來保存信息的文件名,如output,而後在程序中建立兩個文件,文件名爲你所輸入的文件名加上不一樣的後綴造成,如output.timing.log和output.session,而後檢查所輸入的文件是否已存在,若存在,則詢問是否以新的文件覆蓋舊的文件,如果,則刪除原有文件,建立新的文件並寫入數據,若否,則不作任何工做。Replay.sh中輸入一個文件名,首先判斷該文件是否存在,存在則播放。

在Record.sh中,能夠看到script的參數是兩個文件,爲了便於辨認,我在輸入的文件名加上了特定的後綴,即便在Linux上,文件後綴是沒意義的,其中一個後綴的.timing.log,用於存儲時序信息,描述每個命令在什麼時候運行,另外一個文件,後綴爲.session,用於存儲命令輸出。有了這兩個文件就能夠實現播放功能,這就有點像你們熟悉的Windows下的lrc歌詞文件的播放功能吧,我的以爲。

而因爲有兩種輸出,因此就要用數據流重定向,把不一樣的輸出流輸出不一樣的文件中,在Record.sh中咱們也能夠看到,咱們用2>把時序信息經過stderr寫入文件.timing.log,經過>把命令執行信息寫入文件.session。

而Replay.sh則相對簡單,它只須要判斷輸入的文件是否存在,就能夠進行播放。如你想播放上面Record.sh中製做的文件,則只須要輸入output便可。

相關文章
相關標籤/搜索