shell - How to separate multiple commands passed to eval in bash -
i'm trying evaluate multiple lines of shell commands using eval
, when try resolve variables eval separated newline \n
variables not resolved.
x='echo a' y='echo b' z="$x\n$y" eval $x eval $y eval $z
which outputs:
a b anecho b
the last command gives anecho b
, , apparently \n
treated n
there. there way evaluate multiple lines of commands (say, separated \n
)?
\n
not newline; it's escape sequence in situations translated newline, haven't used in 1 of situations. variable $z
doesn't wind containing newline, backslash followed "n". result, what's being executed:
$ echo a\necho b anecho b
you can either use semicolon instead (which requires no translation), or use \n
in context will translated newline:
$ newline=$'\n' $ x='echo a' $ y='echo b' $ z="$x$newline$y" $ eval "$z" b
note double-quotes around "$z"
-- they're critical here. without them, bash word-split value of $z
, turning whitespace (spaces, tabs, newlines) word breaks. if happens, eval
receive words "echo" "a" "echo" b", turning newline space:
$ eval $z echo b
this yet in long list of cases it's important double-quote variable references.
Comments
Post a Comment