bash 函数作为参数执行命令

bash 函数作为参数执行命令

我正在编写一个 bash 脚本,我有一个获取 3 个参数、一个主机名、一个命令和一个文件的函数,它应该在该主机名上执行命令并将输出重定向到文件名。这是函数:

execmd ()
    {
    P_SERV="$1"
    P_CMD="$2"
    P_OUT="$3"

    X_SERV=`hostname`
    if [ "$P_SERV" = "$X_SERV" ] ; then
       $P_CMD >> $P_OUT
    else
       ssh $P_SERV $P_CMD >> $P_OUT
    fi
    }

当我执行时:

execmd venus "cat /proc/meminfo" /tmp/meminfo

我收到错误

cat /proc/meminfo: no such file or directory

知道为什么它不起作用吗?使用本地主机名或远程主机名调用它时,行为相同。

答案1

SSH 执行远程 shell。要获得本地执行的一致行为,请执行本地 shell。

if [ "$P_SERV" = "$X_SERV" ] ; then
   sh -c "$P_CMD" >> "$P_OUT"
else
   ssh "$P_SERV" "$P_CMD" >> "$P_OUT"
fi

别忘了替换周围用双引号引起来。例如,没有双引号,如果P_CMD包含通配符,那么它们将在ssh $P_SERV $P_CMD.

相关内容