Bash: 구문 오류: 리디렉션 예기치 않음
스크립트로 이 작업을 수행합니다.
read direc <<< $(basename `pwd`)
그 결과:
Syntax error: redirection unexpected
우분투 기계로
/bin/bash --version
GNU bash, version 4.0.33(1)-release (x86_64-pc-linux-gnu)
다른 suse 머신에서는 이 에러는 발생하지 않습니다.
/bin/bash --version
GNU bash, version 3.2.39(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.
왜 오류일까요?
스크립트가 참조하고 있습니까?/bin/bash
또는/bin/sh
해쉬뱅 라인으로요?Ubuntu의 기본 시스템 셸은 bash가 아닌 대시입니다.따라서,#!/bin/sh
스크립트는 예상과는 다른 셸을 사용합니다.대시에는 다음이 없습니다.<<<
리다이렉션 연산자
셰방 라인이 다음 상태인지 확인합니다.
#!/bin/bash
또는
#!/usr/bin/env bash
다음으로 스크립트를 실행합니다.
$ ./script.sh
명시적으로 실행하지 마십시오.sh
그러면 셰방이 무시되기 때문입니다.
$ sh ./script.sh # Don't do this!
다음을 사용하여 스크립트를 실행하는 경우:
sudo sh ./script.sh
그 대신 다음 항목을 사용합니다.
sudo bash ./script.sh
그 이유는 Bash가 Ubuntu의 기본 셸이 아니기 때문입니다.따라서 "sh"를 사용하면 기본 셸(실제로 대시)만 사용됩니다.이 문제는 다음 조건에 관계없이 발생합니다.#!/bin/bash
스크립트의 맨 위에 있습니다.그 결과, 명시적으로 다음 명령을 사용할 것을 지정해야 합니다.bash
스크립트는 정상적으로 실행됩니다.
대시는 Bash와 같은 리디렉션을 지원하지 않습니다.
도커:
다음과 같이 Docker file에서 이 문제가 발생하였습니다.
RUN bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
그러나 이 문제에 따라 해결되었습니다.
exec 폼을 사용하면 셸 스트링의 멍깅을 회피하고
RUN
를 포함하지 않는 기본 이미지를 사용하는 명령어/bin/sh
.메모
다른 셸을 사용하려면
/bin/sh
원하는 셸로 전달되는 exec 형식을 사용합니다.예를들면,RUN ["/bin/bash", "-c", "echo hello"]
솔루션:
RUN ["/bin/bash", "-c", "bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)"]
각 파라미터 주위에 따옴표를 붙입니다.
이 명령어의 출력을 가져와 변수에 넣을 수 있습니다.그 후heredoc
예를 들어 다음과 같습니다.
nc -l -p 80 <<< "tested like a charm";
다음과 같이 쓸 수 있습니다.
nc -l -p 80 <<EOF
tested like a charm
EOF
그리고 이렇게(원하는 것은 이것입니다.
text="tested like a charm"
nc -l -p 80 <<EOF
$text
EOF
의 실제 예busybox
아래docker
컨테이너:
kasra@ubuntu:~$ docker run --rm -it busybox
/ # nc -l -p 80 <<< "tested like a charm";
sh: syntax error: unexpected redirection
/ # nc -l -p 80 <<EOL
> tested like a charm
> EOL
^Cpunt! => socket listening, no errors. ^Cpunt! is result of CTRL+C signal.
/ # text="tested like a charm"
/ # nc -l -p 80 <<EOF
> $text
> EOF
^Cpunt!
좀 더 간단한 방법으로,
direc=$(basename `pwd`)
또는 셸을 사용합니다.
$ direc=${PWD##*/}
이 오류의 또 다른 이유는 서브버전 작업복사를 갱신하는 cron 작업을 실행하고 업데이트 후 경합 상태가 된 버전화된 스크립트를 실행하려고 하는 경우일 수 있습니다.
머신에서 스크립트를 직접 실행하는 경우 기본값은 다음과 같습니다.bash
.
를 사용하여 실행한다면sudo
기본값은 입니다.sh
.
그래서 내가 이 문제를 건드린 거야sudo
.
이 에러는, 「>」를 2회 입력했기 때문입니다.
mongodump --db=$DB_NAME --collection=$col --out=$BACKUP_LOCATION/$DB_NAME-$BACKUP_DATE >> >> $LOG_PATH
라고 정정할 뿐입니다.
mongodump --db=$DB_NAME --collection=$col --out=$BACKUP_LOCATION/$DB_NAME-$BACKUP_DATE >> $LOG_PATH
스크립트를 실행하기 전에 셸 스크립트의 첫 번째 행에 인터프리터가 있는지 확인해야 합니다.
예: 스크립트가 /bin/bash로 시작하는 경우 다음 명령어 "bash script_name.sh"를 사용하여 스크립트를 실행합니다.
스크립트가 /bin/sh로 시작하는 경우 다음 명령어 "sh script_name.sh"를 사용하여 스크립트를 실행합니다.
./sample.sh - 스크립트의 첫 줄부터 인터프리터가 검출되어 실행됩니다.
Linux 디스트리뷰션마다 기본적으로 셸이 다릅니다.
1: 인 1 1 1:#!/bin/bash
2:파일의 , 「」2: 「」 「」 「」 「」 「」 「」).chmod 777 test.sh
)
3: ★★★★★★./test.sh
sh test.sh
언급URL : https://stackoverflow.com/questions/2462317/bash-syntax-error-redirection-unexpected
'programing' 카테고리의 다른 글
여러 시트를 .pdf에 저장합니다. (0) | 2023.04.19 |
---|---|
Swift에서 사전으로 플리스트를 얻으려면 어떻게 해야 하나요? (0) | 2023.04.19 |
Windows, Mac OS X 및 Linux는 어떤 언어로 작성됩니까? (0) | 2023.04.19 |
이 블록에서 자신을 강하게 포착하는 것은 유지 사이클로 이어질 수 있다 (0) | 2023.04.19 |
고유 엔트리가 있는 두 목록 간의 차이점 가져오기 (0) | 2023.04.19 |