【问题标题】:How to literally include echo in a command? [duplicate]如何在命令中直接包含 echo? [复制]
【发布时间】:2020-09-06 23:21:08
【问题描述】:

在我的脚本中有:

#!/bin/bash

# Take sudo password from the first argument if present
SUDO="sudo -u postgres"
if [ "$1" != "" ]; then
    SUDO="echo $1 | 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;

所以它只是呼应了这条线。显然,我想要的是逐字运行该命令,但这样$1 就会被扩展:

$ echo myPassword | sudo -S -u postgres psql -c create database foo;

我该怎么做?

【问题讨论】:

  • 理想情况下,您应该只配置 sudo 以允许适当的用途以用户 postgres 的身份运行 psql 而无需输入密码。

标签: bash echo sudo


【解决方案1】:

当您通过扩展变量运行命令时,管道 |、重定向 < 和类似的东西不会被 shell 解释。只有单词会被拆分,并且 glob(*?[])会被扩展。 示例:

$ 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 [ "$1" != "" ]; then
    pw="$1"
    sudoWithPw() { echo "$pw" | sudo -S -u postgres "$@"; }
    SUDO="sudoWithPw"
fi

${SUDO} psql -c "create database foo;"

更好的解决方案是以用户postgres 登录一次,而不是在每个命令前加上${SUDO}。您可以使用susudo bash -c aFunctionYouExportedEarlier 来执行此操作。

【讨论】:

  • 谢谢,这个包装很整洁,很有效:)
猜你喜欢
  • 2013-02-12
  • 2020-11-19
  • 1970-01-01
  • 2017-12-13
  • 2016-06-29
  • 2017-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多