我有一个脚本,我需要在其中启动命令,然后将一些附加命令作为命令 传递给该命令。我试过了
su
echo I should be root now:
who am I
exit
echo done.
... 但它不起作用:su
成功,但命令提示符只是盯着我看。如果我在提示符下键入 exit
,echo
和 who am i
等就会开始执行! echo done.
根本没有执行。
同样,我需要通过 ssh
进行操作:
ssh remotehost
# this should run under my account on remotehost
su
## this should run as root on remotehost
whoami
exit
## back
exit
# back
我该如何解决?
I am looking for answers which solve this in a general fashion, and which are not specific to
su
orssh
in particular. The intent is for this question to become a canonical for this particular pattern.
最佳答案
重要的是要记住,格式化为另一个 shell 的 here-document 的脚本部分是在具有自己环境的不同 shell 中执行的(甚至可能在不同的机器上)。
如果您的脚本 block 包含参数扩展、命令替换和/或算术扩展,那么您必须使用略有不同的 shell 的 here-document 工具,具体取决于您希望在何处执行这些扩展。
1。所有扩展都必须在父 shell 的范围内执行。
然后此处文档的分隔符必须不加引号。
command <<DELIMITER
...
DELIMITER
例子:
#!/bin/bash
a=0
mylogin=$(whoami)
sudo sh <<END
a=1
mylogin=$(whoami)
echo a=$a
echo mylogin=$mylogin
END
echo a=$a
echo mylogin=$mylogin
输出:
a=0
mylogin=leon
a=0
mylogin=leon
2。所有扩展都必须在子 shell 的范围内执行。
然后此处文档的分隔符必须被引号。
command <<'DELIMITER'
...
DELIMITER
例子:
#!/bin/bash
a=0
mylogin=$(whoami)
sudo sh <<'END'
a=1
mylogin=$(whoami)
echo a=$a
echo mylogin=$mylogin
END
echo a=$a
echo mylogin=$mylogin
输出:
a=1
mylogin=root
a=0
mylogin=leon
3。一些扩展必须在子 shell 中执行,一些 - 在父 shell 中执行。
然后此处文档的定界符必须未加引号并且您必须转义那些必须在子 shell 中执行的扩展表达式。
例子:
#!/bin/bash
a=0
mylogin=$(whoami)
sudo sh <<END
a=1
mylogin=\$(whoami)
echo a=$a
echo mylogin=\$mylogin
END
echo a=$a
echo mylogin=$mylogin
输出:
a=0
mylogin=root
a=0
mylogin=leon
关于bash - 将命令作为输入传递给另一个命令(su、ssh、sh 等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53310533/