相关疑难解决方法(0)

为什么“sudo -i”登录 shell 会破坏 here-doc 命令字符串参数?

在下面的五个命令序列中,所有命令都依赖单引号将可能的变量替换传递给被调用的bashshell,而不是调用的 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)

bash sudo here-document

7
推荐指数
1
解决办法
1469
查看次数

为什么在某些版本的 sudo -i 中使用变量时需要花括号?

考虑以下命令:

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.57sudo 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 的共同点)。

bash sudo variable

5
推荐指数
0
解决办法
184
查看次数

标签 统计

bash ×2

sudo ×2

here-document ×1

variable ×1