BashスクリプトでネストされたHEREDOCブロックを使用しようとしています。
ノート
- 外部 HEREDOC は、ユーザーが別のユーザーとして実行するコマンドのリストです。
sudo
cat
内部的には、HEREDOCはプレーンテキストをファイルとしてキャプチャします。
# run some commands as regular user
sudo -s -u $reg_user << EOF
echo "installing Pathogen plugin manager"
mkdir -p ~/.vim/autoload ~/.vim/bundle && \
curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim
# start the nested HEREDOC
#-----------------------------
#
echo "configuring \.vimrc"
cat <<-VRC >> ~/.vimrc
"
"======================================================
" vim core settings
"======================================================
"
" show numbers - to turn off :set nonumber
set number
" always show status bar
set laststatus=2
VRC # limit string to close the inner HEREDOC
echo "more bash commands"
EOF # end the outer HEREDOC - NOTE: this is also the end of the
# entire script itself
このスクリプトが実行されると、出力は次のようになります。
/bin/bash: 行 229: EOF: コマンドが見つかりません。
EOF
BashはなぜこれがHEREDOC区切り文字列ではないコマンドだと思いますか?
- 行の先頭と制限文字列の間のスペースが重要かどうかはわかりません。もしそうなら、教えてくれれば説明します。
更新:以下は、実行可能なコードのコピーと貼り付けを含む単純化されたバージョンのスクリプトです。同じエラーが発生しているようです。
#! /bin/bash
# If you want to run this code you need to assign a valid user here
user="non-root user"
# run some commands as regular user
sudo -s -u $user << EOF
echo "installing plugins"
mkdir -p testdir
# start the nested HEREDOC
#-----------------------------
#
echo "configuring \.config_file"
cat <<-VRC >> /tmp/test_vimrc
"
"======================================================
" vim core settings
"======================================================
"
" show numbers - to turn off :set nonumber
set number
" always show status bar
set laststatus=2
VRC
echo "more bash commands"
EOF
出力エラーは次のとおりです。
/bin/bash: 22行目: 警告: ここでは、文書は8行目のファイルの末尾に区切られています(「VRC」が必要)。
答え1
その後にスペースがありますVRC
。それを削除します。