"모호한 리디렉션"오류 발생


173

내 Bash 스크립트의 다음 줄

 echo $AAAA"     "$DDDD"         "$MOL_TAG  >>  ${OUPUT_RESULTS}

이 오류가 발생합니다.

 line 46: ${OUPUT_RESULTS}: ambiguous redirect

왜?


10
당신은 모든 것을 보여주지 않습니다. 어디셨어요 ${OUPUT_RESULTS}. 만약 당신이 의미한다면 철자 오류$OUTPUT_RESULTS}
ghostdog74

하나를 작성 OUPUT_RESULTS = "filename.log"하면 모호한 리디렉션이 발생합니다. bash는 =연산자 주위에 공간이 없기를 원하기 때문 입니다.
Poutrathor

답변:


269

배쉬는 때로는 꽤 둔감 할 수 있습니다.

다음 명령은 기본적으로 동일한 오류에 대해 서로 다른 오류 메시지를 반환합니다.

$ echo hello >
bash: syntax error near unexpected token `newline`

$ echo hello > ${NONEXISTENT}
bash: ${NONEXISTENT}: ambiguous redirect

$ echo hello > "${NONEXISTENT}"
bash: : No such file or directory

변수 주위에 따옴표를 추가하면 "모호한 리디렉션"메시지를 처리하는 좋은 방법 인 것 같습니다. 입력 실수를 했을 때파일 이름의 공백으로 인해 오류가 발생 하면 더 나은 메시지를받는 경향이 있습니다 . 따옴표를 사용하는 것이 해결책입니다.


1
리디렉션이 포함 된 스크립트의 출력을 리디렉션하면이 정보도 얻을 수 있습니다. 내가 이것을 어떻게 아는지 묻지 마십시오.
Paul Jackson

@PaulJackson, ... 그렇지 않습니다. 복사하여 붙여 넣기 가능한 데모로 : sh -c 'echo hello >/tmp/hello' >/tmp/world제대로 작동합니다.
Charles Duffy

24

명명 된 변수 OUPUT_RESULTSOUTPUT_RESULTS있습니까 아니면 더 가능성이 있습니까?


michael@isolde:~/junk$ ABC=junk.txt
michael@isolde:~/junk$ echo "Booger" > $ABC
michael@isolde:~/junk$ echo "Booger" >> $ABB
bash: $ABB: ambiguous redirect
michael@isolde:~/junk$ 

2
의 경우 ABC="junk file.txt"에도 여전히 문제가 있습니다.
Charles Duffy

15

변수 주위에 따옴표를 넣으십시오. 공백이 있으면 "모호한 리디렉션"도 제공합니다. 또한 철자를 확인하십시오

echo $AAAA"     "$DDDD"         "$MOL_TAG  >>  "${OUPUT_RESULTS}"

예를 들어 모호한 리디렉션

$ var="file with spaces"
$ echo $AAAA"     "$DDDD"         "$MOL_TAG >> ${var}
bash: ${var}: ambiguous redirect
$ echo $AAAA"     "$DDDD"         "$MOL_TAG >> "${var}"
$ cat file\ with\ spaces
aaaa     dddd         mol_tag

1
따옴표는 중요하지 않습니다. 변수 확장에 공백이 있으면 파일 이름의 포스트 스페이스 부분과 관련된 잘못된 파일 및 / 또는 잘못된 오류 메시지가 표시됩니다.
저의 올바른 의견에 동의하십시오.

@JUSTMYcorrectOPINION, 매개 변수 확장 후에 쉘이 재분석되지 않습니다. 즉, 확장 결과 내 공백 이후의 내용으로 인해 다른 구문이 채워질 수 없습니다.
Charles Duffy

5

최근에 리디렉션 파일 이름에 공백이 있으면 "모호한 리디렉션"메시지가 나타납니다.

예를 들어 리디렉션 application$(date +%Y%m%d%k%M%S).log하고 잘못된 서식 문자를 지정하면 오전 10시 전에 리디렉션이 실패합니다. 그러나 사용한 application$(date +%Y%m%d%H%M%S).log경우 성공합니다. 이는 %k형식 ' 9'이 오전 9시에 %H생성 '09'되고 오전 9 시에 생성 되기 때문 입니다.

echo $(date +%Y%m%d%k%M%S) 준다 20140626 95138

echo $(date +%Y%m%d%H%M%S) 준다 20140626095138

잘못된 날짜는 다음과 같습니다.

echo "a" > myapp20140626 95138.log

다음은 원하는 것입니다.

echo "a" > myapp20140626095138.log

오류는 변수에 공백이 있는지 여부에 관계없이 변수 주위에 따옴표가 있어야한다는 것입니다. 쉘 변수를 따옴표로 묶는시기를
tripleee

5

$ {OUPUT_RESULTS}에 지정된 경로에 공백 문자가 포함되어 있습니까? 그렇다면 ... >> "${OUPUT_RESULTS}"따옴표 사용을 고려할 수 있습니다 .

(변수 이름을로 바꾸는 것도 좋습니다 ${OUTPUT_RESULTS})


1

방금 bash 스크립트 에서이 오류가 발생했습니다. 문제는 이전 줄의 끝에 실수로 오류가 발생한 것이 었습니다.


1

"모호한 리디렉션"을 유발할 수있는 또 다른 사항 \t \n \r은 작성중인 변수 이름에 있습니다.

아마 \n\r아닐까요? 그러나주의의 측면에서 잘못

이 시도

echo "a" > ${output_name//[$'\t\n\r']}

\t줄의 시작 부분에 HTML, 탭을 구문 분석하는 동안이 문제에 부딪 쳤습니다 .


오류가 변수를 인용하지 않습니다. 쉘 변수를 따옴표로 묶는시기를
tripleee

1

스크립트의 리디렉션에 변수가 포함되어 있고 스크립트 본문이 괄호로 묶인 섹션에서 해당 변수를 정의하면 "모호한 리디렉션"오류가 발생합니다. 재현 가능한 예는 다음과 같습니다.

  1. vim a.sh 스크립트를 만들려면
  2. 포함 할 스크립트 편집 (logit="/home/ubuntu/test.log" && echo "a") >> ${logit}
  3. chmod +x a.sh 그것을 실행 가능하게 만들기 위해
  4. a.sh

이렇게하면 "/home/ubuntu/a.sh : 1 행 : $ logit : 모호한 리디렉션"이 표시됩니다. 이 때문입니다

"괄호 사이에 명령 목록을 배치하면 내 보내지 않은 변수를 제거하지 않고 서브 쉘이 작성되고 목록의 각 명령이 해당 서브 쉘에서 실행됩니다. 목록이 서브 쉘에서 실행되므로 변수 지정은 유지되지 않습니다. 서브 쉘이 완료된 후에 적용됩니다. "

괄호 사용 에서 표현식 그룹화 및 확장

이를 정정하기 위해 2 단계에서 스크립트를 수정하여 괄호 밖에 변수를 정의 할 수 있습니다. logit="/home/ubuntu/test.log" && (echo "a") >> $logit


0

쉘 명령에서 변수 이름을 사용하는 경우 변수 이름을 +부호로 연결해야합니다 .

예를 들면 다음과 같습니다.

두 개의 파일이 있고 파일 이름을 하드 코딩하지 않으려는 경우 대신 변수 이름을 사용하려고합니다
"input.txt" = x
"output.txt" = y

그런 다음 ( '따옴표 안의 셸 명령'+ x> + y)

os.system 명령으로 파이썬 프로그램에서 이것을 사용하는 경우 특히이 방법으로 작동합니다


0

이 경우도 마찬가지입니다.

변수에 파일을 지정하지 않고 출력을 리디렉션하면 bash는이 오류를 발생시킵니다.

files=`ls`
out_file = /path/to/output_file.t
for i in `echo "$files"`;
do
    content=`cat $i` 
    echo "${content}  ${i}" >> ${out_file}
done

out_file 변수가 올바르게 설정되지 않았으므로 이것도 주시하십시오. BTW이 코드는 모든 내용과 파일 이름을 콘솔에 인쇄합니다.


0

중괄호 확장을 사용하여 출력을 여러 파일에 쓰려고 할 때이 오류가 발생했습니다.

예를 들면 다음과 같습니다 echo "text" > {f1,f2}.txt결과-bash: {f1,f2}.txt: ambiguous redirect

이 경우 tee여러 파일로 출력하는 데 사용 하십시오.

echo "text" | tee {f1,f2,...,fn}.txt 1>/dev/null

1>/dev/null기록되는 텍스트를 방지 할 수 표준 출력

파일에 추가하려면 다음을 사용하십시오. tee -a

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.