Updating the ~/.bashrc file for a script
I am developing a script that will configure and setup an ubuntu-desktop environment. One of the changes it makes is appending functions and other things to the ~/.bashrc
file. Later in the script, I need to call one of the functions added to ~/.bashrc
but I get the command not found
error. Here is an example script:
# t.sh
#!/bin/bash
text='test-func() { echo It works!; }'
echo "$text" >> ~/.bashrc
source ~/.bashrc
test-func
echo checkpoint
Output:
./t.sh: line 10: test-func: command not found
checkpoint
I assumed sourcing ~/.bashrc
would update the shell allowing me to call test-func
but it does not. Googling around I found exec bash
to replace source ~/.bashrc
.
New Output:
./t.sh: line 10: test-func: command not found
From my understanding of exec
, it just creates a new shell cutting the script off; therefore "checkpoint" is never printed out.
How can I update ~/.bashrc
and run the updates in the same script?
Any help is much appreciated.
Actually, your .bashrc
does get sourced. However, .bashrc
is intended to be read by interactive shells. A shell that runs a script is not interactive.
In Ubuntu, .bashrc
checks that the shell sourcing it is interactive, and otherwise stops execution. You should find this line towards the beginning:
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
This causes your script to stop sourcing the file before it reads your function.
You can simply attach your function to another file than .bashrc
and it should work fine. If you insist on using .bashrc
, you could simply set the variable PS1
to some dummy value in your script before sourcing .bashrc
.