什么可以解释下面的例子,我该如何解决这个问题,最好不要大量引用杂技?我正在使用$n
来模拟多行命令字符串,以防它分散您对真正问题的注意力。
~$ n=$'\n'; sudo -i echo "line1${n}line2${n}"
line1line2
~$
Run Code Online (Sandbox Code Playgroud)
但
~$ n=$'\n'; sudo echo "line1${n}line2${n}"
line1
line2
~$
Run Code Online (Sandbox Code Playgroud) 在下面的五个命令序列中,所有命令都依赖单引号将可能的变量替换传递给被调用的bash
shell,而不是调用的 shell。调用用户是xx,但被调用的 shell 将以用户yy运行。第一个命令将 $HOME 替换为调用 shell 的值,因为被调用的 shell 不是登录 shell。第二个命令替换登录 shell 加载的 $HOME 的值,因此它是属于用户yy的值。第三个命令不依赖于 $HOME 值,而是在用户yy的猜测主目录中创建一个文件。
为什么第四个命令失败?目的是写入相同的文件,但依靠属于用户yy的 $HOME 变量来确保它确实最终位于她的主目录中。我不明白为什么登录 shell 会破坏作为静态单引号字符串传入的 here-doc 命令的行为。第五个命令的失败验证了这个问题与变量替换无关。
xx@host ~ $ sudo -u yy bash -c 'echo HOME=$HOME'
HOME=/home/xx
xx@host ~ $ sudo -iu yy bash -c 'echo HOME=$HOME'
HOME=/home/yy
xx@host ~ $ sudo -u yy bash -c 'cat > /home/yy/test.sh << "EOF"
> script-content
> EOF
> '
xx@host ~ $ …
Run Code Online (Sandbox Code Playgroud) 这正如我所期望的那样工作:
$ sudo -u romain bash -c 'a="b" ; echo $a'
b
$
Run Code Online (Sandbox Code Playgroud)
但是跟-i
变量没有回显,为什么呢?
$ sudo -iu romain bash -c 'a="b" ; echo $a'
$
Run Code Online (Sandbox Code Playgroud)
我想知道是否-i
添加了一定程度的 bash 间接或变量插值,但如果是,这如何工作?
$ sudo -iu romain bash -c 'a="b" ; echo ${a}'
b
$
Run Code Online (Sandbox Code Playgroud)