저주를 사용하여 명령의 출력 얻기

저주를 사용하여 명령의 출력 얻기

Python 프로그램의 출력(stdout)을 변수에 넣으려고 하면 다음과 같이 합니다.

set zpath (python something.py "$argv")

그러나 프로그램이 저주 인터페이스를 생성하면 표시되지 않습니다.

프로그램은 무언가를 선택할 수 있는 저주 인터페이스를 일시적으로 표시하고 프로그램이 끝나기 전에 저주를 종료합니다. 유용한 데이터를 표준 출력으로 인쇄합니다.

2>&1 >/dev/tty명령 끝에 추가할 수 있다고 읽었습니다 .

이렇게 하면 저주 인터페이스가 나타나지만 출력은 변수에 저장되지 않습니다.

테스트할 내용을 인쇄하면 변수 대신 셸에 인쇄됩니다.

저주 인터페이스를 작동시키고 표준 출력 캡처도 작동하게 하려면 어떻게 해야 합니까?

/dev/tty로의 리디렉션이 혼란스러워 보이기 때문에 특별히 간단한 솔루션을 찾고 있습니다.

다른 쉘에서 작동하도록 만들어야합니다.

답변1

명령 끝에 2>&1 >/dev/tty를 추가할 수 있다는 내용을 읽었습니다.

이는 stdout을 터미널로 리디렉션하고 stderr를 stdout이 원래 있었던 위치(명령 대체 버퍼)로 리디렉션합니다.

인터페이스가 표시되고 리디렉션 없이 실행해도 인터페이스가 표시되지 않으면 프로그램이 stdout을 사용하여 인터페이스를 표시한다는 의미입니다.

이는 다음을 의미합니다.

유용한 데이터를 표준 출력으로 인쇄합니다.

이 출력은 결국 터미널에도 도달합니다.

프로그램이 인터페이스를 표시하기 위해 표준 출력에서 ​​tty를 사용하려고 하는 것 같습니다.그리고그런 다음 유용한 출력을 동일한 파일 설명자(stdout)로 인쇄하면 두 가지를 별도로 리디렉션할 수 없습니다. 껍질은 분리되어 있지 않기 때문에 분리할 수 없습니다.

당신이 해야 할 일은 인터페이스를 한 파일(예: /dev/tty)에 표시하고 유용한 출력을 다른 파일(예: stdout)에 인쇄하도록 프로그램을 수정하는 것뿐입니다.

이것도 방법이다후지브, 대화형 터미널 인터페이스를 열고 표준 출력으로 무언가를 인쇄합니다. 유닉스에서 실행될 때 /dev/tty가 열립니다. - 참조https://github.com/junegunn/fzf/blob/ef67a45702c01ff93e0ea99a51594c8160f66cc1/src/tui/light_unix.go#L50-L63그리고https://github.com/junegunn/fzf/blob/b3ab6311c587e18ee202c5205afc658a33f2a23c/src/tui/light.go#L29

또는 stdout에 디스플레이를 배치하고 stderr에 유용한 정보를 인쇄할 수 있습니다. 그러면 2>&1 >/dev/tty트릭이 작동하게 됩니다.


참고 사항:

zpath 설정(python Something.py "$argv")

물고기에서는 아마도 그럴 것입니다.아니요이것을 인용하고 싶었습니다 $argv. 여러 인수로 설정된 경우 이제 인수를 함께 의미 없는 것으로 뭉개버린 것입니다. 예를 들어 Fish는 bash처럼 단어 분리를 수행하지 않기 때문에 공백에도 도움이 되지 않습니다. 변수가 X 요소로 설정되면 따옴표 외부로 확장하면 다시 분리할 필요 없이 해당 X 요소로 확장됩니다.

관련 정보