It seems impossible to output a '${
string (escaped) from indented strings.
Examples:
Unescaped is evaluated, as expected:
nix-repl> '' (${x}) ''
error: undefined variable ‘x’ at (string):1:7
Correctly escaped with ''
:
nix-repl> '' (''${x}) ''
"(${x}) "
Trying to add a '
in front of escaped ${
, the first '''
are processed as escaped ''
and ${
is not escaped:
nix-repl> '' ('''${x}) ''
error: undefined variable ‘x’ at (string):1:10
Adding another '
process the first '''
as ''
and the following '${
as unescaped:
nix-repl> '' (''''${x}) ''
error: undefined variable ‘x’ at (string):1:11
Adding another '
process the first '''
as ''
and the following ''${
is escaped to ${
:
nix-repl> '' ('''''${x}) ''
"(''${x}) "
Is there a way to output strings like "('${x})"
from indented strings?
Just noticed this, but for anyone stuck right now, I hacked it together as follows:
let
foo = ''
echo '${"\${zomg}"}'
'';
in foo
Basically, I just gave up trying to escape it in the double single quote context so I actually "escaped" the context and did it in a different string 😄
Indentend strings have a generic escaping mechanism — ''\.
, so you can write '${
as ''\'''\$''\{
or, more practically, as '$''\{
.
I think this can be closed, allthough the example and answer by @orivej here would be a nice addition to the docs imho.
Inspired by @copumpkin, I made a general escaping function escape = content: "$\{" + content + "}";
. With this, you can produce '${}
by '${escape ""}
, and in the more general case use it with ${escape "content"}
within any multiline strings.
Please don't close this as long as this issue is the primary source for information; this really should be mentioned in the docs.
Most helpful comment
Indentend strings have a generic escaping mechanism —
''\.
, so you can write'${
as''\'''\$''\{
or, more practically, as'$''\{
.