CMD.EXE가 비현실적으로 문서화되지 않았다는 것을 감안할 때 예상되는 동작이 무엇인지 확신 할 수 없습니다. 기대 한 행동이 무엇인지에 대한 어떠한 문서도 보지 못했습니다. 그래서 나는 당신이 어떤 행동이 버그인지 여부에 관해 확실한 답을 줄 수있는 사람을 찾기 위해 열심히 노력할 것이라고 생각합니다. 그러나 나는 확실히 일관성이없고 적어도 디자인상의 결함 인 것 같다.
나는 특정 명령의 행동이 재현 될 수있는 것처럼 혼란스러운 상황을 특성화하지는 않을 것이다. 그러나 CMD.EXE는 어떤 명령이 테스트없이 어떻게 작동 하는지를 예측할 수있는 방법을 볼 수 없다는 점에서 일관성이 없습니다.
나는 어떤 설명도하지 않지만, 나는 약간의 세련된 행동 분류를 가지고있다.
명령이 실제로 리디렉션 된 출력에 아무 것도 쓰지 않으려는 경우 stdout 또는 stderr를 stdin으로 리디렉션하면 완벽하게 작동합니다. 비정상적인 동작은 내부 명령이 표준 입력으로 리디렉션 된 후 stdout 또는 stderr에 쓰려고 할 때만 발생합니다.
나는 당신의 시험을 연장했고 다음과 같은 별개의 행동을 보았습니다 :
리디렉션 STDERR 2>&01
철저한 테스트를 수행하지는 않았지만 stderr에 기록한 모든 내부 명령은 stderr이 stdin으로 리디렉션 된 경우 명령 세션을 즉시 종료합니다. 예 :
cd invalidPath 2>&0
vol x 2>&0
copy nonExistentFile 2>&0
move nonExistentFile 2>&0
set nonExistentVariable 2>&0
dir nonExistentFile 2>&0
당신이 생각한 것은 실제로 stderr에 쓰지 않는 예외였습니다. 리디렉션없이 다음을 시도하면 오류 메시지가 표시되지 않습니다.
dir nonExistentFIle *
따라서 stderr이 stdin으로 재 지정되는 경우 명령 세션을 종료 할 명령의 이유가 없습니다.
DIR은 제공된 모든 파일 마스크에서 일치하는 파일을 찾지 못한 경우에만 오류 메시지를 인쇄합니다.
:: This prints an error message
dir nonExistentFile1 nonExistentFile2
:: So this terminates the command session
dir nonExistentFile1 nonExistentFile2 2>&0
리디렉션 된 STDOUT 1>&0
다음은 리디렉션 된 stdout에 대해 본 행동입니다.
1) 출력이 오류 메시지없이 ether로 사라집니다.
예 :
vol >&0
copy /-y file1 existingFile2 >&0
move /-y file1 existingFile2 >&0
2) 출력이 실패하고 stderr에 오류 메시지가 표시됩니다. 하나의 명령으로 여러 실패 메시지를 생성 할 수 있습니다. 하나씩 실패한 각각의 시도는 stdout에 쓰려고 시도합니다.
예 :
cd >&0
echo Hello >&0
:: This generates 2 error messages, one for the time,
:: and another for the subsequent empty line
time /t >&0
3) 출력이 실패하고 일괄 처리가 종료됩니다. 활성 SETLOCAL은 일괄 처리 종료 후에도 CALLed 서브 루틴 내에서 오류가 발생해도 그대로 유지됩니다. 이와 관련하여 치명적인 구문 오류와 유사합니다.
지금까지 나는 단지 하나의 명령이이 동작을 보임을 보았습니다 :
dir >&0
DIR 명령을 시도한 각 출력 줄에 대한 오류 메시지를 생성 할 것으로 예상됩니다. 그러나 첫 번째 줄에서 실패한 후에 종료 된 것으로 보이며 일괄 처리도 중단됩니다.
4) 일부 명령은 여러 가지 동작을 나타냅니다.
예 :
:: This SET command generates an error message for each
:: defined variable (behavior 2)
set >&0
:: But this SET command fails to display the prompt without
:: error message (behavior 1). Note that the echo of user input
:: is written directly to :con. It does not use stdout or stderr.
set "var=prompt" >&0
:: A single PAUSE exhibits both behaviors 1 and 2. The prompt to
:: press a key simply dissapears, and the echo of the user input
:: generates an error. Note that in this case, the echo of user
:: input is written to stdout.
pause >&0
dir
명령이 발견되면 stderr에 기록하지 않습니다. 그리고 네, 일치하지 않는 정확한 용어입니다, 감사합니다.