如何在命令中逐字包含 echo?
How to literally include echo in a command?
在我的脚本中有:
#!/bin/bash
# Take sudo password from the first argument if present
SUDO="sudo -u postgres"
if [ "" != "" ]; then
SUDO="echo | sudo -S -u postgres"
fi
${SUDO} psql -c "create database foo;"
... several other similar commands here ...
当我 运行 带有 myPassword
的脚本时,我得到:
myPassword | sudo -S -u postgres psql -c create database foo;
所以它只是呼应了这条线。显然我想要的是 运行 该命令,但是 </code> 得到扩展:</p>
<p><code>$ echo myPassword | sudo -S -u postgres psql -c create database foo;
我该怎么做?
管道 |
、重定向 <
和类似的东西在您 运行 通过扩展变量来执行命令时不会被 shell 解释。只有单词被拆分并且 globs (*
, ?
, []
) 被扩展。 示例:
$ v='echo a | cat'
$ $v
a | cat > b
要解释它们,您可以使用 eval
$ v='echo a | cat'
$ eval "$v"
a
但是,这是不受欢迎的,因为您经常会遇到引用问题。通常,有更好的方法来解决特定问题。
作为一种更简洁的解决方案,您可以将管道包装在一个函数中:
#!/bin/bash
# Take sudo password from the first argument if present
SUDO="sudo -u postgres"
if [ "" != "" ]; then
pw=""
sudoWithPw() { echo "$pw" | sudo -S -u postgres "$@"; }
SUDO="sudoWithPw"
fi
${SUDO} psql -c "create database foo;"
一个更好的解决方案是仅以用户 postgres
身份登录一次,而不是在每个命令前加上前缀 ${SUDO}
。您可以使用 su
或 sudo bash -c aFunctionYouExportedEarlier
.
在我的脚本中有:
#!/bin/bash
# Take sudo password from the first argument if present
SUDO="sudo -u postgres"
if [ "" != "" ]; then
SUDO="echo | sudo -S -u postgres"
fi
${SUDO} psql -c "create database foo;"
... several other similar commands here ...
当我 运行 带有 myPassword
的脚本时,我得到:
myPassword | sudo -S -u postgres psql -c create database foo;
所以它只是呼应了这条线。显然我想要的是 运行 该命令,但是 </code> 得到扩展:</p>
<p><code>$ echo myPassword | sudo -S -u postgres psql -c create database foo;
我该怎么做?
管道 |
、重定向 <
和类似的东西在您 运行 通过扩展变量来执行命令时不会被 shell 解释。只有单词被拆分并且 globs (*
, ?
, []
) 被扩展。 示例:
$ v='echo a | cat'
$ $v
a | cat > b
要解释它们,您可以使用 eval
$ v='echo a | cat'
$ eval "$v"
a
但是,这是不受欢迎的,因为您经常会遇到引用问题。通常,有更好的方法来解决特定问题。
作为一种更简洁的解决方案,您可以将管道包装在一个函数中:
#!/bin/bash
# Take sudo password from the first argument if present
SUDO="sudo -u postgres"
if [ "" != "" ]; then
pw=""
sudoWithPw() { echo "$pw" | sudo -S -u postgres "$@"; }
SUDO="sudoWithPw"
fi
${SUDO} psql -c "create database foo;"
一个更好的解决方案是仅以用户 postgres
身份登录一次,而不是在每个命令前加上前缀 ${SUDO}
。您可以使用 su
或 sudo bash -c aFunctionYouExportedEarlier
.