추가 읽기

추가 읽기

이렇게 하면 터미널에 연결되어 있지 않은 것으로 감지됩니다. 이는 충분히 공평합니다 ls | less. ls그 외에는less 터미널에 연결하세요. 이 설정에서는 ls터미널에 대한 컬러 및 열 형식 출력이 생성되고 less올바르게 처리될 수 있습니다. 을 사용하여 색상이 올바르게 작동하도록 만들 수 있지만 ls --color=force | less -r더 많은 입력이 필요하고 열이 수행되지 않습니다.

less실제 터미널처럼 취급하기 위해 연결된 모든 것을 알려주는 스위치가 있다면 멋질 것입니다. 따라서 .NET ls | less -T에서 컬러 목록과 열 형식 목록을 모두 얻을 수 있습니다 less.

  1. 이런 일을 해 본 적이 있나요?

  2. less이와 같은 호출기가 실제로 이 작업을 자체적으로 수행할 수 있습니까, 아니면 쉘의 협력이 필요합니까? 예를 들어, 쉘은 ls연결할 의사 터미널을 설정해야 합니까 ?

답변1

파이프라인을 설정하는 쉘입니다. less관련없는.

이렇게 하면 ls | less파이프의 쓰기 끝을 실행하는 프로세스의 표준 출력과 동일한 파이프의 읽기 끝을 실행하는 프로세스의 표준 입력을 생성한 후 쉘이 동시에 시작됩니다 ls.lesslsless

ls표준 출력이 tty 장치가 아님을 감지하고 이에 따라 동작을 변경합니다. less이에 대해 우리가 할 수 있는 일은 아무것도 없습니다.

무엇인가요껍데기수행할 수 있는 작업은 파이프 대신 의사 터미널 쌍을 사용하여 두 프로세스를 연결하는 것입니다. 그러나 의사 터미널은 이를 위해 설계되지 않았기 때문에 이는 좋지 않은 생각입니다. 첫째, 단절은 문제를 야기합니다. less표준 입력이 의사 터미널 호스트인 경우 혼란스러울 수 있습니다.

ls또 다른 접근 방식은 의사 터미널 쌍을 통해 출력을 읽고 less이를 파이프로 연결하는 세 번째 프로세스를 얻는 것입니다.@JdeBP ptyrun또는ptybandage, 또는 expectunbuffer또는 zshzpty내장 함수를 사용하여:

zmodload zsh/zpty
ttypager() { (zpty c "stty raw -echo; ${(q)@}"; zpty -r c) | less -RFX; }

ttypager ls

ls새 터미널의 새 세션에서 실행되므로 ^C를 누르면 SIGINT를 수신하지 못하고 less쓰기를 마치기 전에 종료하면 SIGPIPE를 수신하지 않습니다. 그러나 이러한 경우 마스터를 보유하는 프로세스(여기서는 서브쉘)는 ls여전히 SIGHUP을 받고 종료됩니다.

zpty여기서는 를 사용하는 것처럼 명령을 실행하므로 eval별칭이 확장됩니다. 실제로 인수를 계속 받고 나중에 별칭 확장을 수행 ttypager \ls하므로 호출하더라도 확장됩니다 .ttypagerls

또한 stdout과 stderr 모두 이 의사 터미널로 들어가 결국 파이프로 들어갑니다.

이것은 여전히 ​​​​더러운 해킹입니다. 여기서 가장 쉬운 방법은 ls마치 터미널에 연결된 것처럼 동작하도록 지시하는 것입니다.

다음과 같은 도우미 기능을 사용할 수 있습니다.

paged_ls() { ls -C --color=always "$@" | less -RFX; }

여기서 -C출력을 열로 강제하고( lsGNU를 포함한 일부 구현에서는 출력이 터미널에 도달할 때 기본적으로 이 작업을 수행함) --color=always출력이 터미널에 도달하는지 여부에 관계없이 색상으로 출력을 강제합니다.

답변2

이를 수행하는 일반적인 방법은 Bernstein과 같은 도구를 사용하는 것입니다 ptybandage.

$ptybandage ls > 덜 흔들림;

또는 이 경우에는 Bernstein의 다음이 더 좋습니다 ptyrun.

$ptyrun ls |

추가 읽기

관련 정보