在下面的五个命令序列中,所有命令都依赖单引号将可能的变量替换传递给被调用的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 -i bash -c 'A=2; echo "|${A}|"; echo "|$A|";'
Run Code Online (Sandbox Code Playgroud)
当我在 Debian Linux 上运行它时,它会bash 4.2.37
打印sudo 1.8.5p2
:
|2|
|2|
Run Code Online (Sandbox Code Playgroud)
但是当我在 MacOS High Sierra 上运行它时,bash 3.2.57
它sudo 1.8.17p1
会打印:
|2|
||
Run Code Online (Sandbox Code Playgroud)
$A
为什么没有花括号就不显示?
-i
如果省略该选项,则不会发生这种情况- 两者2
都会被打印。bash
如果我只是跑而不经过,就不会发生这种情况sudo
。
在回答SO 问题时遇到了这种行为。那里的回答者正在运行 Linux,并且bash 4.3.48
得到sudo 1.8.16
了丢失的输出。所以看起来它与sudo
版本有关(或者可能是/etc/sudoers
他的 Linux 和我的 Mac 的共同点)。