天天看點

shell build-in

今天寫了一個簡單的腳本,把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,問題解決