On 6/4/24 11:45, Hongyi Zhao wrote:
Are there any functional differences between these two methods in terms of how the environment variables are set and utilized by my_command?
No, the started process my_command will see the environment variables regardless whether they are set by the env program or by the shell. And that's exactly the difference: which program is starting my_command? $ type export export is a shell builtin The 'export' is shell syntax, and the shell is setting up the environment variable for all the programs started from it. Like Rob wrote, starting a new process is done via the execve() system call. shell (setting up environment) --> my_command In some environments like for a native program, starting another program is and can only be done via execve(), so the program would have to set up the environment variables itself ... or it invokes env(1) for doing this for the final command. some_program --> env --> my_command Alternatively, some_program could invoke the shell to setup the environment variable and that would launch my_command. some_program --> shell (export...) --> my_command e.g. sh -c "export VAR=value; my_command" Sometimes we see this pattern for other shell-syntax (pipes, &&, loops, redirections, etc.) as well. Here's an example from the find/xargs manual to launch the Emacs editor for all header files matching a certain pattern: find /usr/include -name '*.h' \ | xargs grep -l mode_t \ | xargs sh -c 'emacs "$@" < /dev/tty' Emacs Best practice? If there's already a shell started, then it's usually easier to use 'export', otherwise or when starting an intermediate shell many times in a row is too slow, then env(1) is often preferred. Have a nice day, Berny