How can I deal with null environmental variables in my minishell?
-
07-07-2021 - |
Question
I'm making a minishell in C, I'm at the point that I'm accounting for environmental variables. I take the original input line from the user, and pass it to a function:
int expand(char *orig, char *new, int newsize)
Where new is a fixed length char array. I loop through orig until I find ${ and then use getenv to find the value of the variable. If there is in fact a value, I simply copy it to new. However, I'm having problems when there is no value, and getenv returns null.
My teacher told me to simply insert a null character, however this doesn't make any sense to me, and I think he meant something different. If I were to insert a null character into orig, then when I parsed it into arguments, it would think that null character marked the end of string, and wouldn't bother looking for any further arguments.
For example, if I entered a session like so:
echo ${USER} ${NOTHING} ${TERM}
Then:
orig = "echo ${USER} ${NOTHING} ${TERM}\0"
and
new = "echo my_user_name \0 xterm\0"
The output would be:
my_user_name
Because it would consider my_user_name to be the last argument, seeing as there is a null terminator before it can read xterm into the argument list.
I know this is a vague question, but I figured some of you guys are pretty experienced in making minishells and know how this problem is typically addressed.
Solution
Perhaps he meant insert a null string, i.e. replace the variable with nothing. That's what /bin/sh does.
$ echo "hi $joe how are you"
hi how are you
The null character is the one with value 0. It's commonly written as '\0'
. As you know it is the C end-of-string marker.
The null string is also called the empty string. It's ""
. In C it's represented by a 0-length, 1-byte character array, as in:
char str[1] = {'\0'};
But conceptually it's the unique string that contains no characters.
Personally, I prefer to call it the empty string rather than null string. Null is such an overused word. Null character. Null pointers.