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