
동료의 쉘 코드를 보고 있는데 다음과 같은 내용을 보았습니다.
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
다음과 같이 해석됩니다.
명령 은
date
인수와 함께 실행됩니다.2
date 명령의 모든 출력(stdout 및 stderr)은 파일로 리디렉션됩니다
$0
.$0
현재 스크립트의 이름입니다.기호는
>
기본적으로 stdout의 리디렉션을 나타냅니다. 확장 기능으로bash
기호는&>
리디렉션을 나타내는 바로가기입니다.둘 다표준 출력 및 표준 오류. 결과적으로 stdout과 stderr은 모두 파일로 리디렉션됩니다$0
.스크립트 파일을 덮어쓰면 더 이상 유효한 스크립트가 아니며
bash
잘못된 명령에 대해 오류가 발생합니다.
bash
POSIX 쉘과 POSIX 쉘 의 차이점
와 같은 간단한 POSIX 셸에서는 dash
바로가기가 &>
지원되지 않습니다. 따라서 명령은 date 2&>$0
리디렉션됩니다.오직stdout을 파일로 $0
. 이 경우, 이는 date
터미널에 오류 메시지가 표시되는 동안 스크립트 파일을 빈 파일로 덮어쓰는 것을 의미합니다 .