`날짜 2&>$0`은 무엇을 합니까?

`날짜 2&>$0`은 무엇을 합니까?

동료의 쉘 코드를 보고 있는데 다음과 같은 내용을 보았습니다.

date 2&>$0

날짜가 무엇인지는 알지만 2&>$0은 무엇을 하고 있나요? 잠시 외출중이라 이 부분이 뭐였는지 물어볼 수가 없네요.

답변1

게시한 코드가 정확하다고 가정하면 코드가 수행하는 작업은 매우 이상합니다. 그것:

  • 실행date 2, 이는 유효한 호출이 아니며 date오류 메시지를 생성합니다.
  • 표준 출력과 표준 오류를 모두 리디렉션합니다.~와 함께&>,
  • 실행 중인 스크립트가 포함된 파일($0), 기존 내용을 지웁니다.

Bash가 스크립트를 읽는 방식은 파일에서 한 번에 한 줄을 가져오는 것이므로 덮어쓴 파일에서 말도 안되는 결과를 얻고 아마도 종료될 수 있습니다(파일이 이 줄이 표시된 지점보다 짧게 잘렸기 때문입니다). 구문 오류가 발생합니다(원본이 매우 짧고 오류의 일부가 다음 줄에서 읽혀지는 경우).

나는 그 줄에 대한 단 하나의 합법적인 사용을 생각할 수 없습니다. 그러나 당신이 말한 대로 정확히 쓰여진 대로 제공했다고 합니다.


엄밀히 말하면 Bash에 다음 옵션을 사용하여 다른 값을 제공 $0하고 이 코드를 비파괴적으로 실행할 수 있습니다 -c. 그러나 bash -c "$(<test.bash)" output-file그렇게 output-file하는 것은 완전히 잘못된 것입니다.

답변2

요약

아래에서 bash해당 명령이 스크립트에 있으면 스크립트 파일을 오류 메시지로 덮어씁니다.

스크립트를 고려해보세요:

$ cat test.sh
date 2&>$0

이제 스크립트를 실행하세요.

$ bash test.sh
test.sh: line 2: unexpected EOF while looking for matching ``'
test.sh: line 3: syntax error: unexpected end of file

스크립트의 새로운 내용을 살펴보세요.

$ cat test.sh
date: invalid date `2'

설명

명령은 date 2&>$0다음과 같이 해석됩니다.

  1. 명령 은 date인수와 함께 실행됩니다.2

  2. date 명령의 모든 출력(stdout 및 stderr)은 파일로 리디렉션됩니다 $0. $0현재 스크립트의 이름입니다.

    기호는 >기본적으로 stdout의 리디렉션을 나타냅니다. 확장 기능으로 bash기호는 &>리디렉션을 나타내는 바로가기입니다.둘 다표준 출력 및 표준 오류. 결과적으로 stdout과 stderr은 모두 파일로 리디렉션됩니다 $0.

  3. 스크립트 파일을 덮어쓰면 더 이상 유효한 스크립트가 아니며 bash잘못된 명령에 대해 오류가 발생합니다.

bashPOSIX 쉘과 POSIX 쉘 의 차이점

와 같은 간단한 POSIX 셸에서는 dash바로가기가 &>지원되지 않습니다. 따라서 명령은 date 2&>$0리디렉션됩니다.오직stdout을 파일로 $0. 이 경우, 이는 date터미널에 오류 메시지가 표시되는 동안 스크립트 파일을 빈 파일로 덮어쓰는 것을 의미합니다 .

관련 정보