我想知道下面命令中的减号 (-) 和 EOC 是什么意思。我知道像 Perl 这样的一些语言允许您选择任意字符组合(不绑定到 EOF),但这里是这种情况吗?负号对我来说完全是个谜。提前致谢!

ftp -v -n $SERVER  >> $LOG_FILE <<-EOC
            user $USERNAME $PWD
            binary
            cd $DIR1
            mkdir $dir_lock
            get $FILE
            bye
EOC

答案1

这是此处文档重定向。

command <<-word
here-document contents
word

用于word分隔此处文档的 是任意的。使用大写单词很常见,但不是必需的。

in-<<-word作用是从此处文档内容的每行开头删除制表符。

cat <<-SERVICE_ANNOUNCEMENT
    hello
    world
SERVICE_ANNOUNCEMENT

如果上面的此处文档在每行开头都使用文字制表符编写,则将导致输出

hello
world

而不是

    hello
    world

结束分隔符之前的制表符也会被删除<<-(但不能没有-):

cat <<-SERVICE_ANNOUNCEMENT
    hello
    world
    SERVICE_ANNOUNCEMENT

(相同的输出)

答案2

man bash

   If the redirection operator is <<-, then all leading tab characters are
   stripped  from  input  lines  and  the line containing delimiter.  This
   allows here-documents within shell scripts to be indented in a  natural
   fashion.

相关内容