home: services: shells: Double-quote environment variable values.
Fixes <https://issues.guix.gnu.org/56540>. Until now, environment variable values were emitted unquoted, producing invalid shell code if the value contains spaces for example. * gnu/home/services/shells.scm (serialize-posix-env-vars): Define 'shell-quote' procedure in staged code and use it for #$value. * tests/guix-home.sh: Add test for PS1 variable with a value containing spaces.
This commit is contained in:
parent
9e4cbb3076
commit
8af749224f
@ -111,7 +111,20 @@ service type can be extended with a list of file-like objects.")))
|
|||||||
|
|
||||||
(define (serialize-boolean field-name val) "")
|
(define (serialize-boolean field-name val) "")
|
||||||
(define (serialize-posix-env-vars field-name val)
|
(define (serialize-posix-env-vars field-name val)
|
||||||
#~(string-append
|
#~(let ((shell-quote
|
||||||
|
(lambda (value)
|
||||||
|
;; Double-quote VALUE, leaving dollar sign as is.
|
||||||
|
(let ((quoted (list->string
|
||||||
|
(string-fold-right
|
||||||
|
(lambda (chr lst)
|
||||||
|
(case chr
|
||||||
|
((#\" #\\)
|
||||||
|
(append (list chr #\\) lst))
|
||||||
|
(else (cons chr lst))))
|
||||||
|
'()
|
||||||
|
value))))
|
||||||
|
(string-append "\"" quoted "\"")))))
|
||||||
|
(string-append
|
||||||
#$@(map
|
#$@(map
|
||||||
(match-lambda
|
(match-lambda
|
||||||
((key . #f)
|
((key . #f)
|
||||||
@ -119,8 +132,9 @@ service type can be extended with a list of file-like objects.")))
|
|||||||
((key . #t)
|
((key . #t)
|
||||||
#~(string-append "export " #$key "\n"))
|
#~(string-append "export " #$key "\n"))
|
||||||
((key . value)
|
((key . value)
|
||||||
#~(string-append "export " #$key "=" #$value "\n")))
|
#~(string-append "export " #$key "="
|
||||||
val)))
|
(shell-quote #$value) "\n")))
|
||||||
|
val))))
|
||||||
|
|
||||||
|
|
||||||
;;;
|
;;;
|
||||||
|
@ -82,6 +82,8 @@ trap 'chmod -Rf +w "$test_directory"; rm -rf "$test_directory"' EXIT
|
|||||||
(simple-service 'home-bash-service-extension-test
|
(simple-service 'home-bash-service-extension-test
|
||||||
home-bash-service-type
|
home-bash-service-type
|
||||||
(home-bash-extension
|
(home-bash-extension
|
||||||
|
(environment-variables
|
||||||
|
'(("PS1" . "$GUIX_ENVIRONMENT λ ")))
|
||||||
(bashrc
|
(bashrc
|
||||||
(list
|
(list
|
||||||
(plain-file
|
(plain-file
|
||||||
@ -138,6 +140,7 @@ EOF
|
|||||||
# dot-bashrc test file for guix home
|
# dot-bashrc test file for guix home
|
||||||
# the content of bashrc-test-config.sh"
|
# the content of bashrc-test-config.sh"
|
||||||
grep -q "the content of ~/.config/test.conf" "${HOME}/.config/test.conf"
|
grep -q "the content of ~/.config/test.conf" "${HOME}/.config/test.conf"
|
||||||
|
grep '^export PS1="\$GUIX_ENVIRONMENT λ "$' "${HOME}/.bash_profile"
|
||||||
|
|
||||||
# This one should still be here.
|
# This one should still be here.
|
||||||
grep "stay around" "$HOME/.config/random-file"
|
grep "stay around" "$HOME/.config/random-file"
|
||||||
|
Loading…
Reference in New Issue
Block a user