Creating a command history feature in a simple UNIX shell using C


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Creating a command history feature in a simple UNIX shell using C
# 1  
Old 12-31-2005
Creating a command history feature in a simple UNIX shell using C

I'm trying to write a history feature to a very simple UNIX shell that will list the last 10 commands used when control-c is pressed. A user can then run a previous command by typing r x, where x is the first letter of the command. I'm having quite a bit of trouble figuring out what I need to do, I have very little C experience, but I know a fair bit of C++. If anyone could give me some suggestions as to where to start, I'd appreciate it. Here is the code I'm working from right now.

#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>

#define MAX_LINE 80 /* 80 chars per line, per command */
#define BUFFER_SIZE 50
char buffer[BUFFER_SIZE];


/* the signal handling function */
void handle_SIGINT()
{
write(STDOUT_FILENO, buffer, strlen(buffer));

}


/**
* setup() reads in the next command line, separating it into distinct tokens
* using whitespace as delimiters. setup() sets the args parameter as a
* null-terminated string.
*/

void setup(char inputBuffer[], char *args[],int *background)
{
int length, /* # of characters in the command line */
i, /* loop index for accessing inputBuffer array */
start, /* index where beginning of next command parameter is */
ct; /* index of where to place the next parameter into args[] */

ct = 0;

/* read what the user enters on the command line */
length = read(STDIN_FILENO, inputBuffer, MAX_LINE);

start = -1;
if (length == 0)
exit(0); /* ^d was entered, end of user command stream */
if (length < 0){
perror("error reading the command");
exit(-1); /* terminate with error code of -1 */
}

/* examine every character in the inputBuffer */
for (i=0;i<length;i++) {
switch (inputBuffer[i]){
case ' ':
case '\t' : /* argument separators */
if(start != -1){
args[ct] = &inputBuffer[start]; /* set up pointer */
ct++;
}
inputBuffer[i] = '\0'; /* add a null char; make a C string */
start = -1;
break;

case '\n': /* should be the final char examined */
if (start != -1){
args[ct] = &inputBuffer[start];
ct++;
}
inputBuffer[i] = '\0';
args[ct] = NULL; /* no more arguments to this command */
break;

default : /* some other character */
if (start == -1)
start = i;
if (inputBuffer[i] == '&'){
*background = 1;
inputBuffer[i] = '\0';
}
}
}
args[ct] = NULL; /* just in case the input line was > 80 */
}

int main()
{
char inputBuffer[MAX_LINE]; /* buffer to hold the command entered */
int background; /* equals 1 if a command is followed by '&' */
char *args[MAX_LINE/2 +1];
pid_t pid;

/* set up the signal handler */
struct sigaction handler;
handler.sa_handler = handle_SIGINT;
sigaction(SIGINT, &handler, NULL);

while (1){ /* Program terminates normally inside setup */
background = 0;
printf(" sh>\n");
setup(inputBuffer,args,&background); /* get next command */

/* the steps are:
(1) fork a child process using fork() */
pid = fork();

if(pid == 0){ /* child process (2) the child process will
invoke execvp()*/
execvp(args[0], args);
exit(0);
}
else if(pid > 0){ /*parent process (3) if background == 1, the parent
will wait, otherwise returns to the setup() function.
*/
if(background == 1){
wait(NULL);

}/* if */
}/* if */
}
}
# 2  
Old 01-01-2006
I suggest that you maintain a history file to keep track of the past commands, something like what ksh maintains. The file is .sh_history or something similar in the user's home directory. There is another thing that you would have to do, and that is have an escape sequence by which the user enters the history mode. Ksh in vi mode uses Esc to enter the command mode; you have to use something similar.
# 3  
Old 11-13-2007
Did you finished it?

Hi, Did you get this code finished, could you send me a copy if so please, I'd really appreciate, thanks
Email address removed
Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. What is on Your Mind?

The Great History of UNIX (1969-1999) | 30 Years of UNIX History | YouTube Video

I am pleased to announce this new video in 1080 HD for UNIX lovers honoring thirty years of UNIX history spanning from 1969 to 1999 presented in 150 seconds (two and a half minutes) in 1080 HD, celebrating the 50th anniversary of UNIX. The Great History of UNIX (1969-1999) | 30 Years of UNIX... (8 Replies)
Discussion started by: Neo
8 Replies

2. Homework & Coursework Questions

Help with creating a simple shell script

Use and complete the template provided. The entire template must be completed. If you don't, your post may be deleted! 1. The problem statement, all variables and given/known data: Write a shell script that accepts two arguments. The two arguments are the name of 2 files. • If the arguments... (3 Replies)
Discussion started by: Scripter12345
3 Replies

3. Shell Programming and Scripting

UNIX CO command for file version history

Hello :) I'm a newb when it comes to shell scripting and was wondering about a command(s) for a script that could be used to checkout a certain number of version/revision histories of a file. I know for the latest revison you "co filename" or for a certain revision number "co -r*.* filename"... (2 Replies)
Discussion started by: MN-DBA
2 Replies

4. Shell Programming and Scripting

how to execute ksh simple shell script without creating .sh file

please help me to execute a simple shell script like for i in `ls echo $i done . i dont want to create a new sh file to execute it. Can i just type and execute it ? because I always this kind of simple for loops . Please help . Thanks (7 Replies)
Discussion started by: Sooraj_Linux
7 Replies

5. Programming

Unix shell with history features like in bash

hii to all i am developing a simple unix shell in c i want to add history feature in that how could i do that plz help if there is any tutorial or website plz put it here history feature should be like that in bash, when press up key show the previous command typed in console plz be... (1 Reply)
Discussion started by: vipin_jss
1 Replies

6. UNIX for Dummies Questions & Answers

History feature in Unix

Hi, I'm working on two flavours of unix namely HP-UX and sun solaris. In HP-UX, for executing the previous commands, i use the arrow keys. But on sun solaris this is not working. Can anyone explain how to use history feature effectively in sun solaris os? Thanks (4 Replies)
Discussion started by: venkatesht
4 Replies

7. Shell Programming and Scripting

Creating simple shell program

Hi, I'm new to UNIX shell programming... can anyone help in doing the following : 1) create a text file named "Model File" having following columns : Name Number Physics Chemistry 2) prompt user to n rows enter the name, number, physics ,chemistry 3) display the entire columns and rows... (1 Reply)
Discussion started by: Mayuri P R
1 Replies

8. Solaris

unix command history

is there any way to determine the last command entered on a unix machine??? Thanx (3 Replies)
Discussion started by: mm00123
3 Replies

9. UNIX for Advanced & Expert Users

how unix stores command history

Hi techies, I have a doubt upon the command history utilities in Unix ... As far as I know, history stores the event number and command for upto that many number of previous commands executed in the HISTSIZE variable ... my doubt here is can we get the time in which these commands were... (3 Replies)
Discussion started by: Sabari Nath S
3 Replies
Login or Register to Ask a Question