Programing

C 쉘에서 stderr을 stdout으로 리디렉션

crosscheck 2020. 12. 3. 07:31
반응형

C 쉘에서 stderr을 stdout으로 리디렉션


에서 다음 명령을 실행할 때 csh아무것도 얻지 못했지만에서 작동 합니다. 표준 오류를 표준 출력으로 리디렉션 할 수 bash있는 동등한 기능이 csh있습니까?

somecommand 2>&1

csh쉘 리디렉션 과정에서 파일 핸들을 조작하는 광범위한 기능이 있다고 알려진 적이 결코 없다.

다음을 사용하여 표준 출력과 오류를 파일로 리디렉션 할 수 있습니다.

xxx >& filename

그러나 그것은 표준 오류를 현재 표준 출력으로 리디렉션하는 것과는 다릅니다 .


그러나 기본 운영 체제가 파일 시스템에서 프로세스의 표준 출력을 노출하는 경우 (Linux와 /dev/stdout마찬가지로) 다음과 같이 해당 방법을 사용할 수 있습니다.

xxx >& /dev/stdout

이렇게하면 표준 출력 표준 오류가 모두 현재 표준 출력 동일한 위치로 이동하게 bash됩니다 2>&1.

이것은 csh기능 이 아님을 명심하십시오 . 표준 출력을 파일로 노출 하지 않는 운영 체제에서 실행 하는 경우이 방법을 사용할 수 없습니다.


그러나 다른 방법이 있습니다. 를 사용하여 파이프 라인에 전송하면 두 스트림을 하나로 결합 할 수 있으며 |&, 그러면 표준 입력을 표준 출력에 쓰는 파이프 라인 구성 요소를 찾는 것뿐입니다. 당신이 그런 것을 알지 cat못한다면, 당신이 그것에 대해 어떠한 주장도하지 않으면 정확히하는 일 입니다. 따라서 다음과 같은 특정 사례 에서 목적을 달성 할 수 있습니다 .

xxx |& cat

물론, 실행을 중지 아무도 없다 bash(이 시스템의 어딘가에에있어 가정) 내에서csh 당신에게 추가 기능을 제공하는 스크립트. 그런 다음 csh어려움을 겪을 수 있는 더 복잡한 경우에 해당 셸의 풍부한 리디렉션을 사용할 수 있습니다 .

더 자세히 살펴 보겠습니다. 먼저 echo_err문자열을 쓸 실행 파일 만듭니다 stderr.

#include <stdio.h>
int main (int argc, char *argv[]) {
    fprintf (stderr, "stderr (%s)\n", (argc > 1) ? argv[1] : "?");
    return 0;
}

그런 다음 작동 상태를 보여주는 제어 스크립트 test.csh:

#!/usr/bin/csh

ps -ef ; echo ; echo $$ ; echo

echo 'stdout (csh)'
./echo_err csh

bash -c "( echo 'stdout (bash)' ; ./echo_err bash ) 2>&1"

echo는 PID와는 ps당신이있어 보장 할 수 있도록 단순히 csh이 스크립트를 실행할 수 있습니다. 다음을 사용하여이 스크립트를 실행할 때 :

./test.csh >test.out 2>test.err

(초기 리디렉션은 스크립트 실행 bash csh 시작 하기 전에에서 설정 됨 ) out/err파일을 검사하면 다음이 표시됩니다.

test.out:
    UID     PID    PPID  TTY        STIME     COMMAND
    pax    5708    5364  cons0      11:31:14  /usr/bin/ps
    pax    5364    7364  cons0      11:31:13  /usr/bin/tcsh
    pax    7364       1  cons0      10:44:30  /usr/bin/bash

    5364

    stdout (csh)
    stdout (bash)
    stderr (bash)

test.err:
    stderr (csh)

당신은 것을이 볼 수있는 test.csh과정이 있다 는 C 쉘에서 실행하고 호출하는 것을 bash당신에게 전체가주는 내에서 bash리디렉션의 힘을.

The 2>&1 in the bash command quite easily lets you redirect standard error to the current standard output (as desired) without prior knowledge of where standard output is currently going.


I object the above answer and provide my own. csh DOES have this capability and here is how it's done:

xxx |& some_exec # will pipe merged output to your some_exec 

or

xxx |& cat > filename

or if you just want it to merge streams (to stdout) and not redirect to a file or some_exec:

xxx |& tee /dev/null

As paxdiablo said you can use >& to redirect both stdout and stderr. However if you want them separated you can use the following:

(command > stdoutfile) >& stderrfile

...as indicated the above will redirect stdout to stdoutfile and stderr to stderrfile.


What about just

xxx >& /dev/stdout

???


   xxx >& filename

Or do this to see everything on the screen and have it go to your file:

  xxx | & tee ./logfile

I think this is the correct answer for csh.

xxx >/dev/stderr

Note most csh are really tcsh in modern environments:

rmockler> ls -latr /usr/bin/csh

lrwxrwxrwx 1 root root 9 2011-05-03 13:40 /usr/bin/csh -> /bin/tcsh

using a backtick embedded statement to portray this as follows:

echo "`echo 'standard out1'` `echo 'error out1' >/dev/stderr` `echo 'standard out2'`" | tee -a /tmp/test.txt ; cat /tmp/test.txt

if this works for you please bump up to 1. The other suggestions don't work for my csh environment.

참고URL : https://stackoverflow.com/questions/13720246/redirect-stderr-to-stdout-in-c-shell

반응형