$ ls -l /tmp/test/my\ dir/
total 0
Run Code Online (Sandbox Code Playgroud)
我想知道为什么以下运行上述命令的方法失败或成功?
$ abc='ls -l "/tmp/test/my dir"'
$ $abc
ls: cannot access '"/tmp/test/my': No such file or directory
ls: cannot access 'dir"': No such file or directory
$ "$abc"
bash: ls -l "/tmp/test/my dir": No such file or directory
$ bash -c $abc
'my dir'
$ bash -c "$abc"
total 0
$ eval $abc
total 0
$ eval "$abc"
total 0
Run Code Online (Sandbox Code Playgroud) 在 POSIX sh 或 Bourne shell(如在 Solaris 10's 中/bin/sh
)中,是否有可能具有以下内容:
a='some var with spaces and a special space'
printf "%s\n" $a
Run Code Online (Sandbox Code Playgroud)
并且,使用默认值IFS
,得到:
some
var
with
spaces
and
a
special space
Run Code Online (Sandbox Code Playgroud)
也就是说,保护之间的空间special
,并space
通过引用或逃逸的某种组合?
a
事先不知道字数,或者我会尝试类似的东西:
a='some var with spaces and a special\ space'
printf "%s\n" "$a" | while read field1 field2 ...
Run Code Online (Sandbox Code Playgroud)
上下文是Cassandra 中报告的这个错误,其中 OP 试图设置一个环境变量,指定 JVM 的选项:
export JVM_EXTRA_OPTS='-XX:OnOutOfMemoryError="echo oh_no"'
Run Code Online (Sandbox Code Playgroud)
在执行 Cassandra 的脚本中,它必须支持 POSIX sh 和 Solaris sh:
JVM_OPTS="$JVM_OPTS $JVM_EXTRA_OPTS"
#...
exec …
Run Code Online (Sandbox Code Playgroud)