summaryrefslogtreecommitdiff
path: root/src/run
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2023-04-04 21:18:33 +0200
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2023-04-24 10:02:30 +0200
commit2ed7a221fafb25eea937c4e86fb88ee501dba51e (patch)
tree559f741a0058cb6e61c8322c62a020a59570c24a /src/run
parentde99fadd3117d2bbe3d5fdf1c6e7b6855fccf465 (diff)
downloadsystemd-2ed7a221fafb25eea937c4e86fb88ee501dba51e.tar.gz
run: expand variables also with --scope
This makes syntax be the same for commands which are started by the manager and those which are spawned directly (when --scope is used). Before: $ systemd-run -q -t echo '$TERM' xterm-256color $ systemd-run -q --scope echo '$TERM' $TERM Now: $ systemd-run -q --scope echo '$TERM' xterm-256color Previous behaviour can be restored via --expand-environment=no: $ systemd-run -q --scope --expand-environment=no echo '$TERM' $TERM Fixes #22948. At some level, this is a compat break. Fortunately --scope is not very widely used, so I think we can get away with this. Having different syntax depending on whether --scope was used or not was bad UX. A NEWS entry will be required.
Diffstat (limited to 'src/run')
-rw-r--r--src/run/run.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/run/run.c b/src/run/run.c
index 3ad866aaa6..2f5ec9c73b 100644
--- a/src/run/run.c
+++ b/src/run/run.c
@@ -103,8 +103,7 @@ static int help(void) {
" --description=TEXT Description for unit\n"
" --slice=SLICE Run in the specified slice\n"
" --slice-inherit Inherit the slice\n"
- " --expand-environment=BOOL Control server-side expansion of environment\n"
- " variables\n"
+ " --expand-environment=BOOL Control expansion of environment variables\n"
" --no-block Do not wait until operation finished\n"
" -r --remain-after-exit Leave service around until explicitly stopped\n"
" --wait Wait until service stopped again\n"
@@ -1472,7 +1471,7 @@ static int start_transient_scope(sd_bus *bus) {
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL, *reply = NULL;
_cleanup_(bus_wait_for_jobs_freep) BusWaitForJobs *w = NULL;
- _cleanup_strv_free_ char **env = NULL, **user_env = NULL;
+ _cleanup_strv_free_ char **env = NULL, **user_env = NULL, **expanded_cmdline = NULL;
_cleanup_free_ char *scope = NULL;
const char *object = NULL;
sd_id128_t invocation_id;
@@ -1614,6 +1613,13 @@ static int start_transient_scope(sd_bus *bus) {
if (!arg_quiet)
log_info("Running scope as unit: %s", scope);
+ if (arg_expand_environment) {
+ expanded_cmdline = replace_env_argv(arg_cmdline, env);
+ if (!expanded_cmdline)
+ return log_oom();
+ arg_cmdline = expanded_cmdline;
+ }
+
execvpe(arg_cmdline[0], arg_cmdline, env);
return log_error_errno(errno, "Failed to execute: %m");