Ruby에서 $stdout
(앞에 달러 기호가 붙음)과 STDOUT
(모두 대문자로) 의 차이점은 무엇 입니까? 출력 리디렉션을 수행 할 때 사용해야하는 것은 무엇이며 그 이유는 무엇입니까? 동일은 간다 $stderr
하고 STDERR
.
수정 : 방금 관련 질문을 찾았습니다 .
Ruby에서 $stdout
(앞에 달러 기호가 붙음)과 STDOUT
(모두 대문자로) 의 차이점은 무엇 입니까? 출력 리디렉션을 수행 할 때 사용해야하는 것은 무엇이며 그 이유는 무엇입니까? 동일은 간다 $stderr
하고 STDERR
.
수정 : 방금 관련 질문을 찾았습니다 .
$stdout
하고 STDOUT
VS $stdin
및 STDIN
symetrical이다 차이 $stdout
및 $>
VS $stdin
및 $<
아니다.
답변:
$stdout
A는 전역 변수 의 현재 표준 출력을 나타낸다. STDOUT
A는 일정한 표준 출력을 나타내는 일반적으로 기본 값입니다 $stdout
.
으로 STDOUT
일정한되고, 당신이 그것을 다시 정의하지 않아야하지만, 당신이 다시 정의 할 수 있습니다 $stdout
오류없이 / 경고 (재 정의 STDOUT
경고를 올릴 것이다). 예를 들어 다음을 수행 할 수 있습니다.
$stdout = STDERR
동일은 간다 $stderr
와STDERR
따라서 질문의 다른 부분에 답하려면 상수가 아닌 전역 변수를 사용하여 출력을 리디렉션하십시오. 코드에서 다시 변경하도록주의하십시오. 전역 변수를 다시 정의하면 응용 프로그램의 다른 부분에 영향을 미칠 수 있습니다.
$>
하려면 기본 출력 스트림 인을 사용해야 합니다 $stdout
.
IO#reopen
경우 사용하는 것이 더 낫다고 생각하는 이유는 무엇 $stdout
입니까? 이 의견에 전적으로 동의하지 않습니다. 이 $stdout.reopen
메서드 는 수신자를 변경 하며 이전에 STDOUT
다시 할당하지 않은 경우 에도 영향을줍니다 $stdout
. 그것들은 동의어가 아니며 할당으로 인해 다른 값을 유지하고 다시 열면 STDOUT
목적을 깨뜨리는 것이 나쁘지 않습니다 .
STDOUT
전역 상수이므로 변경해서는 안됩니다. $stdout
미리 정의 된 변수이므로 변경할 수 있습니다.셸을 사용하여 리디렉션을 수행하는 경우 :
$ ruby test.rb > test.log
그러면 스크립트가 실행되기 전에 스크립트에 대한 파일 설명 자로 사용하는 것이 중요하지 않습니다.
그러나 Ruby 스크립트 내에서 OS의 STDOUT에 대한 파일 설명자를 변경하려는 경우, 예를 들어 현재 요일을 기준으로 회전하는 로그 파일 세트로 출력을 전송하려는 경우 다음을 확인해야합니다. 당신은 $stdout
.
STDOUT = $stderr (irb):1: warning: al#=> #<IO:<STDERR>>constant STDOUT >> STDOUT #=> #<IO:<STDERR>>
모두 $stdout
와 STDOUT
다른 의미를 가지고있다. Ruby의 문서 는이 주제에 대해 매우 명확합니다.
$stdout
– 현재 표준 출력.STDOUT
– 표준 출력. $ stdout의 기본값입니다.
표준 출력에 쓰려면 실제로 현재 표준 출력을 의미 하므로 $stdout
.
STDOUT
너무 쓸모가 없습니다. 에 대한 기본값을 저장합니다 $stdout
. 재 할당 $stdout
한 경우를 사용하여 이전 값으로 복원 할 수 있습니다 $stdout = STDOUT
.
또한 사전 정의 된 변수가 하나 더 있습니다.
$>
– 기본적으로 인쇄되는 printf의 기본 출력$stdout
.
그러나 Ruby 2.3에서는 단순히 $stdout
. 재 할당 $stdout
하면의 값이 변경 $>
되고 그 반대의 경우도 마찬가지입니다.