Skip to content

Commit 39761df

Browse files
committed
Enclose variable value within single quote for shells
When setting an environment variable on sh and fish shells, enclose the value within single quote rather escaping any special characters. With this change is its possible to have newline character included in environment variable value. Exception is made for csh shells where unsupported newline character in variable value is chopped. Other language supported where already enclosing variable values in single quotes (python, ruby, etc). Fixes #557 Signed-off-by: Xavier Delaruelle <[email protected]>
1 parent 1d1a1f0 commit 39761df

File tree

1 file changed

+10
-6
lines changed

1 file changed

+10
-6
lines changed

tcl/envmngt.tcl.in

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,11 @@ proc renderSettings {} {
232232
new {
233233
switch -- [getState shelltype] {
234234
csh {
235-
set val [charEscaped $::env($var)]
235+
# cannot handle newline character in env var value with csh
236+
# shells: chop newline character in value (as done on
237+
# Modules v3 for all shells)
238+
set val [string map {\n {}} $::env($var)]
239+
set val [charEscaped $val]
236240
# csh barfs on long env vars
237241
if {[getState shell] eq {csh} && [string length $val] >\
238242
[getConf csh_limit]} {
@@ -251,18 +255,18 @@ proc renderSettings {} {
251255
lappend g_shcode_out "setenv $var $val;"
252256
}
253257
sh {
254-
lappend g_shcode_out "$var=[charEscaped $::env($var)];\
255-
export $var;"
258+
set val [string map {' '\\''} $::env($var)]
259+
lappend g_shcode_out "$var='$val'; export $var;"
256260
}
257261
fish {
258-
set val [charEscaped $::env($var)]
262+
set val [charEscaped $::env($var) ']
259263
# fish shell has special treatment for PATH variable
260264
# so its value should be provided as a list separated
261265
# by spaces not by semi-colons
262266
if {$var eq {PATH}} {
263-
regsub -all : $val { } val
267+
set val [join [split $val :] {' '}]
264268
}
265-
lappend g_shcode_out "set -xg $var $val;"
269+
lappend g_shcode_out "set -xg $var '$val';"
266270
}
267271
tcl {
268272
set val $::env($var)

0 commit comments

Comments
 (0)