Internal Bash functions, useful when writing loadable builtins
- Find an environment variable
- Set an environment variable to a string value
- Set an environment variable to a string value if it's not already set
- Check if an environment variable is set
- Check if an environment variable is an array
- Get an environment variable that's an array
- Unset an environment variable
- Create an array
- Unshift a value on to an array
- Popping an array
- Inserting a value into an array
- Get the number of elements in an array
- Print an environment variable's value
- $0, $1, ... $9
- $$
- Name of the currently running builtin
SHELL_VAR* find_variable(const char* name)
SHELL_VAR *var = find_variable("FOO");
if(!var)
printf("FOO not set\n");
SHELL_VAR* bind_variable(const char* name, char* value, int flags)
SHELL_VAR *var = bind_variable("FOO", "fooval", 0);
SHELL_VAR* set_if_not(char *name, char *value)
var_isset(SHELL_VAR* var)
This is a macro
if(var_isset(var) == 0)
printf("Not set\n");
array_p(SHELL_VAR* var)
This is a macro
if(array_p(var) == 0)
printf("Not an array\n");
GET_ARRAY_FROM_VAR(char* name, SHELL_VAR *var, ARRAY *arr)
int unbind_variable(const char* name)
if(unbind_variable("FOO") == -1)
printf("FOO was not set");
char* get_variable_value(SHELL_VAR *var)
SHELL_VAR *var = bind_variable("FOO", "sshaw", 0);
printf("FOO: %s\n", get_variable_value(var));
SHELL_VAR* make_new_array_variable(const char* name)
ARRAY* array_cell(SHELL_VAR *var)
array_cell
is a macro.
Most (all?) array operations are done on the value returned by array_cell
.
SHELL_VAR *var = make_new_array_variable("AN_ARRAY")
if(array_p(var) == 0) {
printf("Array creation failed\n");
return;
}
ARRAY *arr = array_cell(var);
array_push(ARRAY *arr, char *val)
Yes, this does an unshift
array_pop(ARRAY *arr)
int array_insert(ARRAY *arr, arrayind_t pos, char *val);
Here arrayind_t
is an intmax_t
, which is more or less an int
.
SHELL_VAR *var = make_new_array_variable("AN_ARRAY")
/* Error checking */
ARRAY *arr = array_cell(var);
if(array_insert(arr, 0, "Cero") < 0)
printf("Insert failed\n");
int array_num_elements(ARRAY *arr)
This is a macro
SHELL_VAR *var = make_new_array_variable("AN_ARRAY")
/* Error checking */
ARRAY *arr = array_cell(var);
printf("Elements: %d\n", array_num_elements(arr));
void print_var_value(SHELL_VAR *var, int quote)
If quote is non-zero and var contains meta chars value will be quoted. No trailing newline is added.
print_var_value(var, 0);
print_var_value(var_with_meta_chars, 1);
void print_assignment(SHELL_VAR *var)
Prints in export
format, i.e. VAR=VALUE
char *dollar_vars[]
for(int i = 0; i < 10; i++)
if(dollar_vars[i])
printf("$%d: %s\n", i, dollar_vars[i]);
pid_t dollar_dollar_pid
Process id of the bash
process your builtin was loaded into.
extern pid_t dollar_dollar_pid;
printf("$$: %d\n", dollar_dollar_pid);
char* this_command_name
extern char* this_command_name;
printf("Name: %s\n", this_command_name);
Skye Shaw http://github.com/sshaw