Bash脚本在之前运行一个命令。我希望他们一个接一个

时间:2016-03-16 02:31:30

标签: linux bash

因此,我的部分内容如下:

ssh user@$remoteServer "
    cd ~/a/b/c/;
    echo -e 'blah blah'
    sleep 1 # Added this just to make sure it waits.
    foo=`grep something xyz.log |sed 's/something//g' |sed 's/something-else//g'`
    echo $foo > ~/xyz.list
    exit "

在我的输出中,我看到:

grep: xyz.log: No such file or directory
blah blah

当我ssh到服务器时,xyz.log确实存在于〜/ a / b / c /

为什么grep语句在echo语句之前执行?

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:4)

这里的问题是你的反引号命令正在本地运行,而不是在SSH连接的远程端运行。因此,它甚至可以在您连接到远程系统之前运行! (对于以双引号运行的所有扩展都是如此,因此$foo中的echo $foo也是如此。

使用引用的heredoc来保护您的代码免受本地评估:

ssh user@$remoteServer bash -s <<'EOF'
    cd ~/a/b/c/;
    echo -e 'blah blah'
    sleep 1 # Added this just to make sure it waits.
    foo=`grep something xyz.log |sed 's/something//g' |sed 's/something-else//g'`
    echo $foo > ~/xyz.list
    exit
EOF

如果你想从本地传递一个变量,那么简单的方法是使用位置参数:

printf -v varsStr '%q ' "$varOne" "$varTwo"
ssh "user@$remoteServer" "bash -s $varsStr" <<'EOF'
  varOne=$1; varTwo=$2 # set as remote variables
  echo "Remote value of varOne is $varOne"
  echo "Remote value of varTwo is $varTwo"
EOF

答案 1 :(得分:1)

[命令服务器] ------&gt; [远程服务器]

更好的方法是在&#34;远程服务器&#34;中创建shell脚本。 ,并在&#34;命令服务器中运行命令&#34;如:

ssh ${remoteserver} "/bin/bash /foo/foo.sh"

它将解决许多问题,目的是使事情简单但不复杂。