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
. 그것을 제거.