今天寫了一個簡單的腳本,把history重定向/opt/log/history中,并以日期的格式輸出
#!/bin/bash
export HISTSIZE=1000000
export HISTFILESIZE=1000000000
export HISTTIMEFORMAT="%F %T `whoami` "
his_date=`date +%Y-%m-%d`
his=`history |wc -l`
if [ $his -ge 0 ]; then
history -a
history 1> /opt/log/history/$his_date
history -c
echo "xxx"
fi
到/opt/log/history/目錄中确實多了一個以時間格式的檔案,打開檔案發現裡邊是空的。
為什麼檔案是空的?确實這個腳本是沒有問題的,并可以執行
問題出在哪裡?結果發現問題是history這條指令,我們執行
#which history
/usr/bin/which: no history in (/usr/lib/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin)
#whatis history
history (3) - GNU History Library
history [builtins] (1) - bash built-in commands, see bash(1)
原來history是系統内建指令
了解一下什麼是内建指令
内建指令指的就是包含在Bash工具包中的
指令, 從字面意思上看就是built in. 這主要是考慮到執行效率的問題 -- 内建指令将比外部指令執行的更快, 一部分原因是因為外部指令通常都需要fork出一個單獨的程序來執行 -- 另一部分原因是特定的内建指令需要直接通路shell的核心部分.
當一個指令或者是shell本身需要初始化(或者建立)一個新的子程序來執行一個任務的時候, 這種行為被稱為fork. 這個新産生的程序被叫做子程序, 并且這個程序是從父程序中fork出來的. 當子程序執行它的任務時, 父程序也在運作.
注意: 當父程序獲得了子程序的程序ID時, 父程序可以給子程序傳遞參數, 然而反過來卻不行
通常情況下, 腳本中的Bash内建指令在運作的時候是不會fork出一個子程序的. 但是腳本中的外部或者過濾指令通常會fork出一個子程序.
如何解決問題
去掉腳本中的#!/bin/bash,問題解決