hello friends,
I am looking for a way to do what I described in the title. When running command command, I dont want to have to type SOME_ENV_VAR=value command every time, especially if there are multiple.
I am sure youre immediately thinking aliases. My issue with aliases is that if I do this for several programs, my .bashrc will get large and messy quickly. I would prefer a way to separate those by program or application, rather than put them all in one file.
Is there a clean way to do this?
Is there some reason you just don’t export those env vars in
$HOME/.bashrcor$HOME/.bash_profile?export SOME_ENV_VAR=valueIf it’s every time you run the command, seems like it should be set globally.
Because it’s not as maintainable as separating them by application or some other separation. Would not want to fill up my bashrc with single-application specific code.
You could break it out into other files if you really got that much going on. But if you really have hundreds or more env vars, maybe you should re-think using env vars at all.
Hard to give a rec without more detail, so I don’t really get it.
You could source an
aliases.shfile on your .bashrc where you define your aliases, so that they don’t fill up your bashrc.For example, in your bashrc:
source ~/.aliases.shThis way you could also create a file with aliases per program.
FYI:
$HOME/.bash_aliasesis standard and most distros’.bashrcwill source that file by default.Most Debian based distros, actually.
And at least arch. Probably others.
That’s a good idea, but it only makes the problem a little better. I still wouldn’t want one large aliases.sh file with environment variables for every application I customized. Would rather have them separate somehow without gobbling up a file
You can source other files inside
aliases.shor as @treadful noted.bash_aliases.bash_aliases:source .aliases/program_x.shsource .aliases/program_y.shThis way you can have a file with aliases for each application or group of applications.
But it would be helpful if you provided more information on what you really want to do. Read https://xyproblem.info/
function command_one() { # activate the environment source "$XDG_DATA_HOME/venvs/alpha.sh" # run the thing actual_command_one } function command_two() { # activate the environment source "$XDG_DATA_HOME/venvs/alpha.sh" source "$XDG_DATA_HOME/venvs/bravo.sh" # run the other thing actual_command_two }You can add a new executable in your
~/.local/bindirectory likecommand_customthat would startSOME_ENV_VAR=value command. Like if you use bash:#!/usr/bin/bash SOME_ENV_VAR=value commandDo not forget to
chmod +xthe file to make it executable.This way you will have additional command for your user only (no sudo require to create/update those), for system-wise command put it in
/usr/local/bin.You could write a shell script:
#!/usr/bin/env sh export SOME_ENV_VAR=value commandThen place it on your path, for example
/usr/local/bin/command_with_env.I avoided overriding the command itself and naming the script the same, because then I think it would try to invoke itself.
Just replace
commandin your script with/usr/bin/commandor whatever. It’s generally good practice to full path anything run from a script anyway just to remove any unintended environment dependencies.Good point. But then if both the script and the command have the same filename, it will be important to make sure the script has a higher precedence in the
PATH. Adding it to the end of.bashrcshould be enough I think.
Put your aliases in .bash_aliases
Make sure your .bashrc sources .bash_aliases like this:
if [ -f ~/.bash_aliases ]; then . ~/.bash_aliases fiStructure your
.bash_files. Have a.bash_aliasesand a.bash_functions, then just source them from your.bashrc. If you’re like me, they may get a little busy, but it’s not really that big of a deal to prune the files every couple years. I find things that I added for jobs, used a lot on the job, then not at all afterwards. It helps to comment the hell out of your files, but it’s not super necessary. You could break up your aliases into different files by program and source them, but that seems like more work for not much payoff.You could alias the your programs’ commands to invoke the environment variables.
Or, use an alias to source an environment file before launching the binary?
If you were using Zsh, one way you could do this is by autoloading function files from a folder in your
fpath.Let’s say you’re using
~/.local/share/zsh/site-functionsfor your custom functions. To ensure that folder is an early part of yourfpath, put something like this within your.zshrc:typeset -U fpath=(~/.local/share/zsh/site-functions $fpath)Then let’s say you want to override the
uptimecommand. Add a file~/.local/share/zsh/site-functions/uptimewith content like:NO_COLOR=1 =uptimeExplanation for the second
=:`=' expansion If a word begins with an unquoted `=' and the EQUALS option is set, the remainder of the word is taken as the name of a command. If a command ex‐ ists by that name, the word is replaced by the full pathname of the command.The last thing you need to do is mark it for autoloading, in your
.zshrc:autoload -Uz uptimeInstead of listing those functions manually as arguments, you could instead use a glob pattern to collect all those names, excluding any which begin with
_(completion functions):autoload -Uz ~/.local/share/zsh/site-functions/[^_]*(:t)deleted by creator





