2013-07-03 2 views
1

명령 대체를 통해 ncurses 기반 프로그램을 호출 할 수 있기를 바랍니다. 따라서이 명령의 출력을 명령 줄 인수로 다른 프로그램에 전달할 수 있습니다.명령 대체에 사용될 때 ncurses 프로그램이 올바르게 작동하지 않습니다.

echo $(pwd) # should be the same as just calling pwd alone 

나는 (그 코드 아래에 다음) 내 프로그램이 작업을 수행하려고 모드는 입력하지 않습니다 저주, 그리고 : 프로그램이 저주 모드로 전환하지 않는 경우 예를 들어,이 떠들썩한 파티에서 할 쉽습니다 문자열 "test"는 절대로 인쇄되지 않습니다. curses 모드를 입력하는 것이 중요합니다. 이론적으로, 사용자가 어떻게 든 stdout에 마지막으로 인쇄 된 문자열을 조작 할 것이기 때문입니다 (바로 지금 문자열이 정적입니다).

echo $(./a.out) # just prints an empty line 

내 프로그램은 저주 모드를 입력 한 후 정상적으로 실행하면, "테스트"가 화면에 출력하고 사용자가 키를 누를는 "이 테스트 아니다"문자열을 반환합니다. 여기

./a.out # normal run 

는 잘못된 코드입니다 :

// test.cpp 
#include <ncurses.h> 
#include <iostream> 
using namespace std; 

/* get curses up and running */ 
void init() { 
    initscr(); // start curses mode, might clear screen 
    raw(); // disable line buff, and C-z/C-c won't gen sigals; see cbreak() 
    keypad(stdscr, TRUE); // enable arrow keys and function keys 
    noecho(); // don't echo chars user types 
} 

/* shut curses down */ 
void end() { 
    endwin(); // end curses mode 
} 

int main() 
{ 
    init(); 
    printw("test"); 
    getch(); 
    end(); 

    cout << "this is not a test" << endl; 
    return 0; 
} 

내가이 명령을 사용하여 컴파일 :

g++ test.cpp -lcurses 

여러분의 도움에 감사드립니다!

+1

아마 때문이다. 예를 들어, 쉘이 파이프로 출력을 여는 중일 수 있습니다. –

+0

어쨌든 그 주위에 있습니까? –

+0

아마도 'if (isatty (fileno (stdin)) ... else ...'또는 입력 내용이 "tty"기능을 가지고 있는지 (즉, 파일이나 파이프가 아닌지, 본질적으로) -'... '의 두 섹션은 curses를 초기화하고 있거나 초기화하지 않는 것을 나타냅니다. –

답변

2

여기 newterm를 사용하여, 간단한 해결책 : 프로그램이 "콘솔"이 장치로 직접 사용할 수없는 환경에서 실행

#define _XOPEN_SOURCE 
#include <ncurses.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

int main() 
{ 
    // start curses mode 
    SCREEN* s = NULL; 
    FILE* out = stdout; 
    if(!isatty(fileno(stdout))) { 
     out = fopen("/dev/tty", "w"); 
     // Should really test `out` to make sure that worked. 
     setbuf(out, NULL); 
    } 
    // Here, we don't worry about the case where stdin has been 
    // redirected, but we could do something similar to out 
    // for input, opening "/dev/tty" in mode "r" for in if necessary. 
    s = newterm(NULL, out, stdin); 

    printw("test"); 
    getch(); 

    endwin(); // end curses mode 
    delscreen(s); 
    puts("/home/matt"); 
    return 0; 
} 
+0

물고기 껍질에 대해 아는 것이 있습니까? 어떤 이유로 bash와 sh에서는 작동하지만 fish에서는 작동하지 않습니다. –

+0

@MatthewMellott : 나는 물고기 껍질에 대해 거의 아무것도 모른다. 그러나 일이 실패하는 방법 *을 지정하는 것이 항상 유용합니다. "작동하지 않는다"는 것은 진단하기에 매우 광범위합니다. 내가 할 첫 번째 일은 코드 전체에 실패 테스트를 추가하는 것입니다. – rici

+0

'echo (./a.out)'를 시도 할 때, 예를 들어 curses 모드가 입력되지 않으면 개행 만 인쇄됩니다. –

관련 문제