【问题标题】:Bash command substitution on remote host [duplicate]远程主机上的 Bash 命令替换 [重复]
【发布时间】:2016-03-19 03:27:59
【问题描述】:

我正在尝试在远程主机上运行 ssh 的 bash 脚本并停止正在运行的单个 docker 容器。

#!/usr/bin/env bash

set -e

ssh <machine> <<EOF

container=$(docker ps | awk 'NR==2' | awk '{print $1;}')

docker stop $container

EOF

但是,我收到以下错误:

stop.sh: line 4: docker: command not found

当我手动执行此操作(ssh 到机器,运行命令)时,一切都很好,但是当我尝试通过脚本执行此操作时,我得到了错误。我想我的命令替换语法不正确,我已经搜索并尝试了各种引号等但无济于事。

谁能指出我哪里出错了?

【问题讨论】:

  • Heredocs 对其内容执行参数扩展,因此您的 $(docker ps ...)$container 评估在代码到达 ssh 的标准输入之前发生。

标签: linux bash ssh


【解决方案1】:

在启动heredoc 时使用&lt;&lt;'EOF'(或&lt;&lt;\EOF - 仅引用第一个字符将产生相同的效果)以防止其扩展在本地进行评估。


顺便说一句,就我个人而言,我会写这个有点不同:

#!/bin/sh -e
ssh "$1" bash <<'EOF'
{ read; read container _; } < <(docker ps)
docker stop "$container"
EOF

第一个read消耗docker ps输出的第一行;第二个仅提取第一列 - 仅使用 bash 内置函数。

【讨论】:

  • 工作得像个魅力查尔斯。非常感谢!
  • @user1061799,很高兴为您提供帮助。顺便说一句,我已经修改了脚本的建议替代形式。不过,如果您仍然想使用awk,您可以使用awk 'NR == 2 { print $1 }' 将两个调用合并到一行中。
  • 这样更整洁。再次感谢查尔斯
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-16
  • 1970-01-01
  • 2015-07-05
  • 2012-01-12
  • 1970-01-01
  • 2023-04-08
相关资源
最近更新 更多