So my .profile
looks like this:
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
if [ -f "$HOME/.local/share/profile" ]; then
. "$HOME/.local/share/profile"
fi
set PATH so it includes user's private bin directories
PATH="$HOME/bin:$HOME/.local/bin:$PATH"
export VISUAL=nano
export EDITOR="$VISUAL"
stty -ixon
function test-func {
echo test-func
}
alias test-alias='echo test-alias'
When I log into Gnome (on Fedora 35) and open the terminal emulator, I can't execute the function test-func
.
$ test-func
bash: test-func: command not found
But when I put the function in my .bashrc
file and re-logout and log back in, I am able to execute the test-func
function.
Is there a reason why functions added to .profile
are not available in the environment?
Edit: So I noticed that when I log in using a non-graphical login (using the Ctrl + Alt + F3 trick), the test-func
function is available. Is there a reason why Gnome doesn't make functions in the .profile
available to non-login shells?
Edit 2: I also noticed that using a POSIX-compliant syntax for the functions (func-name () { ... }
instead of function func-name { ... }
) had no effect.
.profile
aren't loaded in Gnome. I know the.profile
is being sourced when I log in, because I can put environment variables in there and they are available in my terminal emulator as well as applications launched directly from Gnome. – wheeler May 11 '22 at 23:30systemd --user
daemon. It inherits the environment variables of the login shell that launched it, but it directly executes the processes that start your UI. Your gnome-terminal is a child of that process. As far as the shell in your terminal can tell, it has the inherited environment variables but no functions. – jsbillings May 11 '22 at 23:58function test-func { ... }
isn't POSIX compatible is a factor here? Does it behave differently withtest-func () { ... }
? – steeldriver May 12 '22 at 00:29~/.bash_profile
file? Are other things set in your.profile
working as expected? The variables, for example? – terdon May 12 '22 at 11:54~/.bash_profile
exists, and the.profile
is otherwise working as expected because the environment variables defined in there are available in the terminal emulator after login. Additionally, if I addtouch ~/profile-test-file
to my~/.profile
, the file gets created when I log in. When I addtouch ~/bashrc-test-file
to my~/.bashrc
file, the file gets created when I start the terminal emulator. – wheeler May 12 '22 at 16:52ls -l /bin/sh
give? Andgrep $(id -un) /etc/passwd | cut -d: -f7
? Also, you can list all the environment variables and functions in bash by calling the builtinset
without parameters (set | less
to page it). – Vilinkameni May 18 '22 at 11:24