programing

Bash: 구문 오류: 리디렉션 예기치 않음

elseif 2023. 4. 19. 22:27

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.shsh test.sh

언급URL : https://stackoverflow.com/questions/2462317/bash-syntax-error-redirection-unexpected