Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I have been bashing my head to write a simple history script for the last two days. History is a shell-built in command I couldn't able to use that within a BASH script. So, Is there a way attain this using BASH script ?
Here we go my script for you:

history |  tail -100 > /tmp/history.log
cd /tmp
uuencode history.log history.txt  | mail -s "History log of server" hello@hel.com
share|improve this question

Bash disables history in noninteractive shells by default, but you can turn it on.

set -o history
history | tail …

But if you're trying to monitor activity on that server, the shell history is useless (it's trivial to run commands that don't show up in the history). See How can I log all process launches in Linux.

share|improve this answer
This refuses to work in a script: histtest.sh: 5: set: Illegal option -o history – Ken Sharp Jan 7 at 2:56
@KenSharp That's because you tried to use it in an sh script (and your sh is dash juding by the exact wording of the error message). To access bash's history, you need to use bash (script starting with #!/bin/bash or #!/usr/bin/env bash). – Gilles Jan 7 at 12:36
@KenSharp Yes it is. You obviously ran it under dash, given the error message. Bash does not have the error message Illegal option (it would say set: history: invalid option name). – Gilles Jan 7 at 15:45

I'm not sure if it actually uses the history capability when running non-interactively, otherwise every shell script you run would clutter up your command history.

Why not go directly to the source ${HOME}/.bash_history, replace history | tail -100 with tail -100 ${HOME}/.bash_history. (If you use timestamps you'd probably have to do something along the lines of grep -v ^# ${HOME}/.bash_history | tail -100).

share|improve this answer

The history builtin seems to be disabled inside a shell script. See here: http://www.tldp.org/LDP/abs/html/histcommands.html

I have not found any official documentation about this.

share|improve this answer

Create a script named script.sh as below. It creates a script named X and puts Y Number of lines of your history into it.


# Enable History in a non interactive shell
set -o history

# echo shabang line and x number of lines of history to new script
echo \#\!\/bin\/bash > $SCRIPT_NAME.sh; history | tail -n $NUMBER_OF_LINES_BACK >> $SCRIPT_NAME.sh;
chmod u+x $SCRIPT_NAME.sh;

# Open the newly created script with vim
vim $SCRIPT_NAME.sh;

Then if you want to create a script to a accomplish a task named "task" that you have been working on for the last 14 lines run

script.sh task 14

Then clean up your history to make a nice script!

share|improve this answer
histtest.sh: 5: set: Illegal option -o history – Ken Sharp Jan 7 at 3:03

Every user have it's own history file which is result of history command.Instead of using history command in your shell script you can use history file for user. There will be a .bash_history file in home directory of user, that will be the history file for the user.

share|improve this answer

If you want to use the output of the history command from an active shell session in a script, you can use an alias to run the command first. Then, in the same alias, you can call the remainder of the script. With such a configuration, you can achieve essentially the same result as having the history command in the actual script.

For instance, you can create an alias like this, assuming the script's name is script.sh:

alias hy_tmp='history | tail -100 > /tmp/history.log ; bash /patch/to/script.sh'

And change the script to this:

cd /tmp
uuencode history.log history.txt  | mail -s "History log of server" hello@hel.com

I found this question while writing a process to combine, sort and synchronize ~/bash_history files on two computers so it'll be easy to search commands I've used in the past.

It's much less of a hassle to update my cumulative history file without having to log into a new shell to have ~/bash_history updated. For monitoring a server this will obviously not work, as mentioned in the other answers.

My usage in particular is:

alias hbye='history | cut -c 8- > /home/chris/.bash_history_c; bash /hby.sh

The script hby.sh then pulls all unique entries from all ~/.bash_history* files.

share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.