以下のコマンドのマイナス (-) と 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

here-document を区切るために使用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.

関連情報