[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
03/05: home: services: shells: Double-quote environment variable values.
From: |
guix-commits |
Subject: |
03/05: home: services: shells: Double-quote environment variable values. |
Date: |
Wed, 13 Jul 2022 19:09:21 -0400 (EDT) |
civodul pushed a commit to branch master
in repository guix.
commit 8af749224fd69daee5b67295186c77becb1a4479
Author: Ludovic Courtès <ludo@gnu.org>
AuthorDate: Wed Jul 13 17:14:20 2022 +0200
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.
---
gnu/home/services/shells.scm | 34 ++++++++++++++++++++++++----------
tests/guix-home.sh | 3 +++
2 files changed, 27 insertions(+), 10 deletions(-)
diff --git a/gnu/home/services/shells.scm b/gnu/home/services/shells.scm
index 27190934f0..28d717f03d 100644
--- a/gnu/home/services/shells.scm
+++ b/gnu/home/services/shells.scm
@@ -111,16 +111,30 @@ service type can be extended with a list of file-like
objects.")))
(define (serialize-boolean field-name val) "")
(define (serialize-posix-env-vars field-name val)
- #~(string-append
- #$@(map
- (match-lambda
- ((key . #f)
- "")
- ((key . #t)
- #~(string-append "export " #$key "\n"))
- ((key . value)
- #~(string-append "export " #$key "=" #$value "\n")))
- val)))
+ #~(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
+ (match-lambda
+ ((key . #f)
+ "")
+ ((key . #t)
+ #~(string-append "export " #$key "\n"))
+ ((key . value)
+ #~(string-append "export " #$key "="
+ (shell-quote #$value) "\n")))
+ val))))
;;;
diff --git a/tests/guix-home.sh b/tests/guix-home.sh
index 8a7048a9ca..a3c979530d 100644
--- a/tests/guix-home.sh
+++ b/tests/guix-home.sh
@@ -82,6 +82,8 @@ trap 'chmod -Rf +w "$test_directory"; rm -rf
"$test_directory"' EXIT
(simple-service 'home-bash-service-extension-test
home-bash-service-type
(home-bash-extension
+ (environment-variables
+ '(("PS1" . "$GUIX_ENVIRONMENT λ ")))
(bashrc
(list
(plain-file
@@ -138,6 +140,7 @@ EOF
# dot-bashrc test file for guix home
# the content of bashrc-test-config.sh"
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.
grep "stay around" "$HOME/.config/random-file"