Ruby에서 $ stdout과 STDOUT의 차이점


89

Ruby에서 $stdout(앞에 달러 기호가 붙음)과 STDOUT(모두 대문자로) 의 차이점은 무엇 입니까? 출력 리디렉션을 수행 할 때 사용해야하는 것은 무엇이며 그 이유는 무엇입니까? 동일은 간다 $stderr하고 STDERR.

수정 : 방금 관련 질문을 찾았습니다 .



@theTinMan 다소 중복입니다. 그러나이 차이 반면 주목해야 $stdout하고 STDOUTVS $stdinSTDINsymetrical이다 차이 $stdout$>VS $stdin$<아니다.
skalee

답변:


108

$stdoutA는 전역 변수 의 현재 표준 출력을 나타낸다. STDOUTA는 일정한 표준 출력을 나타내는 일반적으로 기본 값입니다 $stdout.

으로 STDOUT일정한되고, 당신이 그것을 다시 정의하지 않아야하지만, 당신이 다시 정의 할 수 있습니다 $stdout오류없이 / 경고 (재 정의 STDOUT경고를 올릴 것이다). 예를 들어 다음을 수행 할 수 있습니다.

$stdout = STDERR

동일은 간다 $stderrSTDERR


따라서 질문의 다른 부분에 답하려면 상수가 아닌 전역 변수를 사용하여 출력을 리디렉션하십시오. 코드에서 다시 변경하도록주의하십시오. 전역 변수를 다시 정의하면 응용 프로그램의 다른 부분에 영향을 미칠 수 있습니다.


3
실제로 출력을 리디렉션 $>하려면 기본 출력 스트림 인을 사용해야 합니다 $stdout.
Jörg W Mittag 2011

10
그냥 발견 다른 질문에 코멘트 말했다 $stdout$>, 별명은 그렇게 하나가 다른 영향을 미칠 것입니다 재 할당.
jrdioko 2011

9
@jrdioko : 당신이 맞아요. 분명히, 나는뿐만 아니라 나 또한 뭔가 매일 :-) 잊고, 새로운 것을 매일 배울
요 르그 W MITTAG

2
그리고 더 많이 읽으면 간단한 할당 대신 IO # reopen 을 사용하는 것이 더 나은 것처럼 들립니다 .
jrdioko 2011

@jrdioko의 IO#reopen경우 사용하는 것이 더 낫다고 생각하는 이유는 무엇 $stdout입니까? 이 의견에 전적으로 동의하지 않습니다. 이 $stdout.reopen메서드 는 수신자를 변경 하며 이전에 STDOUT다시 할당하지 않은 경우 에도 영향을줍니다 $stdout. 그것들은 동의어가 아니며 할당으로 인해 다른 값을 유지하고 다시 열면 STDOUT목적을 깨뜨리는 것이 나쁘지 않습니다 .
skalee 16.03.03

5
  • STDOUT 전역 상수이므로 변경해서는 안됩니다.
  • $stdout 미리 정의 된 변수이므로 변경할 수 있습니다.

셸을 사용하여 리디렉션을 수행하는 경우 :

$ ruby test.rb > test.log

그러면 스크립트가 실행되기 전에 스크립트에 대한 파일 설명 자로 사용하는 것이 중요하지 않습니다.

그러나 Ruby 스크립트 내에서 OS의 STDOUT에 대한 파일 설명자를 변경하려는 경우, 예를 들어 현재 요일을 기준으로 회전하는 로그 파일 세트로 출력을 전송하려는 경우 다음을 확인해야합니다. 당신은 $stdout.


5
"STDOUT은 전역 상수이므로 변경되지 않습니다." 변경할 수있는 상수이지만 경고가 발생합니다. STDOUT = $stderr (irb):1: warning: al#=> #<IO:<STDERR>>constant STDOUT >> STDOUT #=> #<IO:<STDERR>>
틴 남자

아, 그렇습니다. "변경해서는 안됩니다"라고 말해야합니다. 감사!
shakerlxxv

5

모두 $stdoutSTDOUT다른 의미를 가지고있다. Ruby의 문서 는이 주제에 대해 매우 명확합니다.

  • $stdout – 현재 표준 출력.
  • STDOUT– 표준 출력. $ stdout의 기본값입니다.

표준 출력에 쓰려면 실제로 현재 표준 출력을 의미 하므로 $stdout.

STDOUT너무 쓸모가 없습니다. 에 대한 기본값을 저장합니다 $stdout. 재 할당 $stdout한 경우를 사용하여 이전 값으로 복원 할 수 있습니다 $stdout = STDOUT.

또한 사전 정의 된 변수가 하나 더 있습니다.

  • $>– 기본적으로 인쇄되는 printf의 기본 출력 $stdout.

그러나 Ruby 2.3에서는 단순히 $stdout. 재 할당 $stdout하면의 값이 변경 $>되고 그 반대의 경우도 마찬가지입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.