도구 세트의 역사

도구 세트의 역사

출력이 터미널로 전달될 때 동작을 변경하는 명령(예: 컬러 출력 생성)이 주어지면 변경된 동작을 유지하면서 파이프라인에서 해당 출력을 어떻게 리디렉션할 수 있습니까? 내가 모르는 유틸리티가 있을 것입니다.

일부 명령(예: grep --color=always)에는 동작을 강제하는 옵션 플래그가 있지만 문제는 출력 파일 설명자 테스트에만 의존하는 프로그램에서 이를 해결하는 방법입니다.

중요한 경우 내 쉘은 bashLinux에 있습니다.

답변1

도구 세트의 역사

이런 도구를 원하는 사람은 당신이 처음이 아닙니다. 사람들은 30년 동안 이와 같은 도구를 원해왔습니다. 그 사람들도 꽤 오랫동안 주변에 있었어요.

이런 종류의 일을 위한 최초의 도구는 Rich Salz가 "Ginsu 칼"이라고 묘사한 Daniel J. Bernstein의 "pty" 패키지였습니다. Bernstein은 1990년대 초에 nethacks를 속이기 위해 썼습니다(sic!). "pty" 패키지의 버전 4는 1992년에 출시되었습니다 comp.sources.unix(Volume 25, Issues 127-135). World Wide Web에서는 여전히 찾을 수 있습니다. Paul Vixie는 당시에 이렇게 설명했습니다.

내가 뭐라고 말할 수 있니? 썰고, 깍둑썰기하고, 설거지하고, 개 산책시키는 일이죠. 이는 "그냥 작동합니다". 즉, 지침을 따르면 머리카락을 뽑거나 이를 갈거나 기타 표준 이식 활동 없이 작동하는 패키지를 얻을 수 있다는 의미입니다.

Bernstein은 나중에 "ptyget" 패키지를 사용하여 1999년 4월 7일 또는 그 이전에 이를 업데이트하여 다음과 같이 발표했습니다.

나는 새로운 pseudo-tty 할당자 ptyget을 조립했습니다. 알파 버전은 에서 사용할 수 있습니다 ftp://koobera.math.uic.edu/pub/software/ptyget-0.50.tar.gz. 가입하려면 ptyget 메일링 리스트가 있습니다. 로 빈 메시지를 보내세요 [email protected]. 나는 ptyget의 인터페이스를 처음부터 디자인했습니다. pty보다 모듈화되어 있습니다. 기본 pty 인터페이스는 이제 세 부분으로 나뉩니다.

  • ptyget: 새로운 pseudo-tty를 할당하고 이를 선택한 프로그램에 전달하는 작은 저수준 프로그램(패키지의 유일한 setuid 프로그램)
  • ptyspawn: 의사 터미널에서 하위 프로세스를 실행하고 하위 프로세스가 종료될 때까지 기다리고 중지 상황을 관찰하는 또 다른 작은 프로그램입니다.
  • ptyio: 데이터를 앞뒤로 이동하는 약간 더 큰 또 다른 프로그램

오래된 "Ginsu" 칼은 pty이제 "Ginsu ptybandage"로 표기됩니다 ptyget ptyio -t ptyspawn. 이는 네트워크 프로그램을 pseudo-tty에 연결하는 데 사용되었으며 이제는 "Ginsu" 로 pty -d표기됩니다 . 그리고 의 동의어입니다 . 세션 관리 기능을 별도의 패키지로 분리했습니다.ptyrunptyget ptyio ptyspawnnobufptyget ptyio -r ptyspawn -23x

별도의 패키지는 "sess" 패키지입니다.

덧붙여서, "ptyget"은 출판된 몇 안 되는 사례 중 하나인 Berstein의 아직 출시되지 않은 "재작업된" 빌드 시스템의 초기 버전을 보여주는 것으로 유명합니다. dependon그것은 분명한 신호이다 redo-ifchange.

용법

ptybandage

ptybandage사람들이 일반적으로 로그인 세션에서 원하는 것입니다. 주요 사용 사례는 표준 입력, 출력 또는 오류가 실제로 쉘 파이프에 있더라도 이러한 방식으로 실행되는 터미널에 연결되어 있는지 여부에 민감한 프로그램을 갖거나 표준 파일 설명자를 파일로 리디렉션하는 것입니다. .

실행하려면 명령이 필요하며(물론 적절한 외부 명령이어야 함) 표준 입력, 출력 및 오류가 터미널에 연결되어 있다고 생각하는 방식으로 이를 ptybandage원래 표준 입력 에 연결하여 실행합니다. , 출력 및 오류.

이는 작업 제어 셸에서 실행되는 미묘한 차이를 처리하여 터미널 STOP 문자가 중지할 뿐만 아니라 ptybandage실행 중인 내부 터미널에 연결된 프로그램도 중지하도록 합니다.

ptyrun

ptyrun사람들이 일반적으로 TCP 웹 서버에서 원하는 것입니다. 주요 사용 사례는 터미널이 자체적으로 설정되지 않고 터미널 없이 예상대로 실행되지 않는 프로그램을 실행하는 원격 실행 환경입니다.

작업 제어 셸에서 실행될 것으로 예상되지 않으며 실행 중인 명령이 중지 신호를 받으면 간단히 다시 시작됩니다.

사용 가능한 도구 세트

Dru Nelson은 "pty"와 "ptyget"의 버전 4를 출시했습니다.

Paul Jarc는 운영 체제가 더 이상 실제로 제공하지 않는 원래 버전에서 운영 체제별 의사 터미널 장치 ioctl을 처리하려고 시도하는 ptyget의 수정된 버전을 출시했습니다.

nosh 소스 패키지에는 Laurent Bercot의 도구와 nosh 패키지의 자체 의사 터미널 관리 명령을 사용하는 유사한 작업 ptybandange및 스크립트가 함께 제공됩니다. nosh 버전 1.23부터 nosh-terminal-extras 패키지에 사전 패키지되어 제공됩니다. (이전 버전에서는 소스에서 빌드하는 사람들만 사용할 수 있었습니다.)ptyrunexecline

몇 가지 예는 다음과 같습니다

ptybandageAIX의 Jurjgen Oskam암호 프롬프트에 대한 제어 터미널을 명시적으로 열고 읽는 프로그램에 이 문서의 입력을 제공합니다.

$ ptybandage dsmadmc <<EOF>uit.txt
요스캄
비밀번호
쿼리 세션
쿼리 프로세스
사직하다
EOF

ptyrunOpenBSD의 앤디 브래드포드daemontools 및 ucspi-tcp에서 bgplgsh대화형 라우터 제어 프로그램이 터미널과 통신하고 있다고 생각하면서 네트워크를 통해 액세스할 수 있도록 만듭니다.

#!/bin/sh
2>&1을 실행
envuidgid rviews tcpserver -vDRHl0 0 23 ptyrun /usr/bin/bgplgsh 실행

추가 읽기

답변2

당신은 그것을 사용하여 필요한 것을 얻을 수 있습니다 unbuffer.

unbuffertcl/ 스크립트 입니다 expect. 필요하다면 출처를 확인하세요. 또한 man의 CAVEATS 섹션을 참고하세요.

또한 앨리어싱을 수행하지 않습니다. 예를 들면 다음과 같습니다.

alias ls='ls --color=auto'

Stéphane Chazelas가 지적한 트릭을 추가하지 않는 한:

(후행 공백에 유의) 을 수행하면 alias unbuffer='unbuffer '별칭이 뒤에 확장됩니다 unbuffer.

답변3

당신은 그것을 사용할 수 있습니다소캇프로세스를 시작하세요푸티연결하고 socat이 pty의 다른 쪽 끝을 파일에 연결하도록 합니다. 귀하가 요청한 AFAIU는 정확히 무엇입니까?

socat EXEC:"my-command",pty GOPEN:mylog.log

이 접근법은 다음과 같은 결과를 가져올 것입니다.isattymy-commandreturn 을 위해 호출되며 true, 이것에만 의존하는 프로세스는 속아서 제어 코드를 출력하게 됩니다. 일부 프로세스(특히 grep)는 환경 변수의 값도 확인하므로 환경 TERM변수를 합리적인 값으로 설정해야 할 수도 있습니다."xterm"

답변4

사용해 보는 것은 어떨까요 script(1)?

예를 들어:

script -q -c 'ls -G' out_file

출력이 저장 ls되고 out_file색상 코드가 유지됩니다.

관련 정보