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

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

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

date 2&>$0

날짜가 무엇인지는 알지만 2&>$0은 무엇을 하고 있나요? 한동안 외출 중이라 이 부분이 무엇인지는 물어볼 수 없습니다.

답변1

게시한 코드가 정확하다고 가정하면 이상한 일이 발생합니다. 그것:

  • 달리기date 2, 이는 유효한 호출이 아니며 date오류 메시지를 생성합니다.
  • 표준 출력 및 표준 오류를 리디렉션합니다.그리고&>,
  • 실행 중인 스크립트가 포함된 파일로 이동합니다($0), 기존 콘텐츠를 삭제하세요.

Bash가 스크립트를 읽는 방식은 파일에서 한 번에 한 줄을 가져오는 것이기 때문에 덮어쓴 파일에서 의미 없는 내용을 가져오고 종료됩니다(파일이 해당 줄이 나타나는 지점보다 짧게 잘렸기 때문입니다). ) 또는 give 문법 오류가 발생합니다(원본 텍스트가 매우 짧고 일부 오류가 다음 줄로 읽혀지는 경우).

나는 그 줄에 대한 어떤 합법적인 사용도 생각할 수 없지만, 당신이 말했듯이, 당신은 그것을 쓰여진 대로 정확하게 제공했고 그게 바로 그 일입니다.


엄밀히 말하면 에 다른 값을 할당하는 것이 가능하므로 $0다음 옵션으로 Bash를 호출하여 이 코드를 비파괴적으로 실행할 수 있습니다 -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)의 모든 출력은 file 로 리디렉션 됩니다 $0. $0

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

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

bashPOSIX 쉘과 POSIX 쉘의 차이점

예를 들어 간단한 POSIX 셸의 경우 dash바로가기가 지원되지 않습니다. &>따라서 명령은 date 2&>$0리디렉션됩니다.오직파일로의 표준 출력 $0. 이 경우 스크립트 파일을 빈 파일로 덮어쓰고 date터미널에 오류 메시지가 표시된다는 의미입니다.

관련 정보