https://bugs.kde.org/show_bug.cgi?id=490432
Bug ID: 490432 Summary: ~/.config/plasma-workspace/env startup scripts cannot set a variable as empty Classification: Plasma Product: plasmashell Version: 6.0.5 Platform: NixOS OS: Linux Status: REPORTED Severity: normal Priority: NOR Component: Startup process Assignee: plasma-b...@kde.org Reporter: hexclo...@outlook.com CC: k...@davidedmundson.co.uk Target Milestone: 1.0 SUMMARY Plasma workspace allows the user to set environment variables in .sh files located in ~/.config/plasma-workspace/env. However, if one sets a variable to the empty string, it does not get exported into the plasma process. STEPS TO REPRODUCE Put these into ~/.config/plasma-workspace/env/foo.sh and give it +x permission: ```bash export SHOULD_BE_ONE=1 export SHOULD_BE_NONE= ``` Then boot KDE. OBSERVED RESULT SHOULD_BE_ONE is 1 but SHOULD_BE_NONE is unset. EXPECTED RESULT SHOULD_BE_NONE should be set to the empty string (should appear in the output of `env`). SOFTWARE/OS VERSIONS Operating System: NixOS 24.05 KDE Plasma Version: 6.0.5 KDE Frameworks Version: 6.2.0 Qt Version: 6.7.2 Graphics Platform: Wayland ADDITIONAL INFORMATION To fix the problem, arguably we should fix this function in `startplasma.cpp`: ```cpp void setEnvironmentVariable(const char *name, QByteArrayView value) { if (qgetenv(name) != value) { qputenv(name, value); } } ``` `qgetenv` is documented to return the an empty byte array if the variable is unset, so `gputenv` is not called. This behavior is not always problematic, but consider the following situation. Suppose some env var `X` is set in the DBus environment already, but the user would like to use the value they specified. `startplasma-wayland.cpp` does three things in order: 1. Source `env/*.sh` and import the env vars by calling `runEnvironmentScripts()` 2. Sync environment to DBus by calling `syncDBusEnvironment()` 3. Import systemd env vars by calling `importSystemdEnvrionment()` If in the .sh file `X` is set, it should be imported into the plasma process in step 1, then exported to DBus in step 2, so step 3 just re-import that exported value, which is set by the user. However, if the user sets `X` to be empty in the script, then it won't get pass step 1, so the value from systemd will be used after step 3. -- You are receiving this mail because: You are watching all bug changes.