在shell脚本

时间:2017-06-29 16:56:51

标签: linux shell ssh

现在我有这个档案到目前为止......

#!/usr/bin/env bash

DIRECTORY=$1

ssh root@example.com "$( cat <<'EOT'
cd /web/$DIRECTORY || exit
pwd
unset GIT_DIR
git log --oneline -n 10 --decorate
git branch
EOT
)";

为什么pwd只打印出“/ web /”?它实际上似乎并没有使用我的变量。然后所有git命令都会抛出有关在web目录中的错误。

如果我在ssh-ing之前将它回显$ DIRECTORY,它会回显我的变量,但拒绝将其传递给ssh命令?

1 个答案:

答案 0 :(得分:1)

这是因为你引用了这里的doc分隔符。这是POSIX

  

如果引用 word 中的任何字符,则通过对单词执行引号删除来形成分隔符,并且here-document行将不会展开。否则,分隔符就是单词本身。

这是一个例子:

#!/bin/bash
var=42

cat << 'end'
With quotes: $var and \$var
end

cat << end
Without quotes: $var and \$var
end

执行时:

With quotes: $var and \$var
Without quotes: 42 and $var