2015-12-13 36 views
0

我试图运行一个bash脚本,ssh到远程主机上并停止正在运行的单个docker容器。远程主机上的Bash命令替换

#!/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到机器上,运行命令)一切都很好,但试图借助这样做时,一个脚本我得到错误。我想我的命令替换语法是不正确的,我搜索并尝试各种引号等,但无济于事。

任何人都可以指出我要出错的地方吗?

+0

Heredocs执行其内容的参数扩展,因此您的'$(docker ps ...)'和'$ container'评估发生在代码获取到ssh的stdin之前。 –

回答

5

使用<<'EOF'(或<<\EOF - 引用只有第一个字符将具有相同的效果)启动您的heredoc时,以防止其扩展在本地进行评估。


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

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

第一read消耗docker ps输出的第一线;第二个只提取第一列 - 只使用bash内建。

+0

工作就像一个魅力查尔斯。非常感谢! – user1061799

+0

@ user1061799,很高兴提供帮助。顺便说一句,我已经为脚本提出了替代形式进行了修改。但是,如果您仍然想使用'awk',则可以使用'awk'NR == 2 {print $ 1}''将两个调用合并为一行。 –

+0

这是更好的选择。再次感谢Charles – user1061799