좀 더 대화형 터미널이 있다면 프로그램 출력에 대화형 기능을 추가하고 텍스트 요소를 간단한 링크나 컨텍스트 메뉴와 같은 클릭 가능한 위젯으로 변환하여 일부 작업의 속도를 높일 수 있다면 좋을 것 같습니다.
예:
- Git과 통합:
자식 지점
, 클릭 가능한 분기 이름으로 변환됩니다. 그 중 하나를 클릭하면 해당 분기로 전환됩니다.
- 표준 명령과 통합:
ls -al
ls
, 디렉터리 이름을 클릭하면 해당 디렉터리 로 이동합니다 . 마우스 오른쪽 버튼을 클릭하면 "cd to...", "ls 디렉터리..." 등이 포함된 상황에 맞는 메뉴가 표시됩니다.
이러한 스크립트를 지원하고 터미널의 텍스트 창 위에 UI 요소 레이어를 생성하는 기존 솔루션이 있습니까?
답변1
이러한 유형의 기능을 제공하는 TE(터미널 에뮬레이터)에 대한 비디오를 한두 개 본 적이 있습니다. 나는 그 이름을 기억하지 못하며, 다시는 들어본 적도 없는 것 같습니다. 아마도 그럴 만한 이유가 있을 것입니다.
TE에서 이 동작을 구현하는 것은 완전히 절망적입니다. 나는 몇 가지 질문을 통해 이것을 보여주고 싶습니다. 이것은 질문의 성격을 보여주기 위해 고안된 수사적 질문이며, 나는 대답을 기대하지 않으며, 각 대답에 대해 비슷한 성격의 후속 질문을 수십 개 물을 수 있습니다.
먼저 TE가 특정 출력이 ls
또는 ls -l
이와 유사한 것으로부터 나온다는 것을 어떻게든 알고 있다고 가정합니다. 어떻게 파싱할까요?
ls
얼마나 많은 서식 옵션이 있는지 확인하세요 . 긴 목록에는 열이 추가되거나 제거될 수 있습니다. 사용자 정의 형식을 포함하여 여러 날짜 형식이 있으며 최근 파일은 이전 파일과 완전히 다른 두 가지 형식을 가질 수 있습니다. 구문 분석하기 어려운 방법을 포함하여 파일 이름에 특수 문자를 나타내는 방법은 다양합니다.
물론 파서에게 이러한 형식을 모두 가르치려고 할 수도 있지만 어떤 형식을 적용해야 할지 알 수 있을까요? 어떻게? 해당 prompt$ ls -l
줄을 찾아 그로부터 알 수 있는 것처럼 실행된 명령을 살펴보나요 ? 아니요, 별칭은 종종 일부 명령줄 스위치를 포함하는 데 사용되기 때문에 모릅니다 ls
(다른 유틸리티는 TE에서도 볼 수 없는 환경 변수를 통해 유사하게 제어할 수 있습니다).
어쩌면 사용자가 ls
다양한 출력 형식으로 여러 구현을 설치했을 수도 있고 실행했을 수도 있습니다. ~/bin/foo-ls
출력을 처리하는 방법은 무엇입니까?
많은 사용자는 대표자 l
또는 이와 유사한 별칭을 가지고 있습니다. 이 경우 TE는 어떻게 식별됩니까?ll
ls -l
사용자가 ls $dir
또는 ls $(some-command-that-prints-a-directory-name)
. TE는 어떤 디렉토리 목록이 표시되는지 어떻게 알 수 있나요?
git branch
저에게는 호출기가 나타나서 less
터미널에 보이는 다른 모든 것을 일시적으로 숨깁니다. 분기 이름만 인쇄하도록 구성할 수도 있고( 호출하지 않고 less
) less
콘텐츠가 한 페이지에 맞는 경우에만 즉시 종료하도록 지시할 수도 있다고 확신합니다. 내부에 있는 경우 less
콘텐츠를 가로로 스크롤하기 시작하면 긴 분기 이름이 부분적으로 사라질 수 있습니다. 또는 도움말 페이지를 호출한 다음 다시 돌아와 실제 콘텐츠를 볼 수 있습니다. TE는 이 모든 것을 어떻게 추적하고 화면의 어떤 단어가 지점 이름인지 알 수 있습니까?
git
별칭을 어떻게 식별합니까 ? 예를 들어 git br
사용자가 그러한 별칭을 구성했습니까? 예를 들어, TE는 git
이후 제대로 작동하지 않는 구성을 조사하고 해결합니까 ssh
?
어떤 명령이 실행되고 있는지 어떻게 알 수 있나요? 가장 가까운 추측은 힌트를 구문 분석하는 것입니다(제가 설명했듯이 잘못된 추측으로 이어질 수 있음). 힌트를 어떻게 찾나요? 사용자, 특히 멋진 기능을 요구하는 사용자는 프롬프트를 크게 맞춤화하는 경향이 있습니다. 그렇다면 실행 중인 명령을 찾는 방법은 무엇입니까? 통제할 수 없을 정도로 많은 사용자 정의 가능한 프롬프트를 분석하는 영역에 들어가야 합니다. (여기서 iTerm2의 쉘 통합은 복사할 수 있는 명시적 이스케이프 시퀀스를 통해 멋진 솔루션을 도입합니다.)
또한 내가 어떤 쉘을 사용하고 있는지 어떻게 알 수 있나요? 더 복잡한 명령줄의 경우 쉘마다 구문이 다릅니다.
더 복잡한 명령을 처리하는 방법은 무엇입니까? 예를 들어, 실행 ls; git branch
파일 목록이 끝나고 git 분기 목록이 시작되는 위치를 출력에서 어떻게 알 수 있습니까?
cd foo; ls; cd ..; git branch
명령과 같은 작업을 위해 디렉터리를 추적하는 방법과 같이 디렉터리 변경을 처리하는 방법은 무엇입니까 ? 을 고려 $CDPATH
하고 cd
에 별칭을 지정할 수도 있습니다 cd -P
.
이제 이러한 모든 문제를 어떻게든 극복했고 TE가 특정 단어에 대한 드롭다운 상자를 표시한다고 가정해 보겠습니다. 사용자가 클릭하면 TE가 작업을 수행하려고 합니다.
어떻게 하나요?
TE에는 내부 애플리케이션(예: 셸)에 명령을 보내는 올바른 방법이 없습니다. 사용자가 입력한 다음 Enter를 누르는 것처럼 키 입력을 합성할 수 있지만 ls -l that-particular-directory
쉘이 명령 입력을 기다리고 있고 해당 명령줄이 현재 비어 있는 경우에만 작동합니다. 다른 대화형 응용 프로그램이 실행 중이거나 일부 부분 명령이 입력되었거나 인쇄 ssh
연결을 종료한 that-particular-directory
경우 이러한 키 입력을 조합하면 문제가 심각하게 중단될 수 있습니다. TE는 현재 이러한 키를 삽입하는 것이 안전한지 어떻게 알 수 있나요?
아니면 TE 자체가 필요한 명령을 실행합니까(그 사이에 셸 없이)? 그러면 출력을 삽입해야 하는 화면의 위치가 혼란스럽지 않습니까? 그리고 그에 속하는 프롬프트와 명령줄도 없습니다. 그리고 그것은 건널 수 없습니다 ssh
.
위의 질문은 상황이 어떻게 잘못될 수 있는지를 표면적으로만 보여줍니다.
터미널 에뮬레이션과 그에 따른 애플리케이션은 약 40~50년 동안 발전해 왔으며(잘 모르겠습니다), 이 수준의 유용성은 결코 목표가 아니었습니다. 이를 달성하려면 모든 것이 완전히 다른 방식으로 수행되어야 합니다.
이야기의 개발자 리소스 측면도 있습니다. 그러한 처리를 요구하는 유틸리티 회사는 얼마나 됩니까? 당신은 그것을 언급했고 ls
, git
내 생각에 당신은 더 많은 것을 생각해 낼 수 있다고 생각합니다. 이 유틸리티에는 몇 개의 작동 모드가 있습니까? 둘 다의 숫자는 엄청납니다. 따라서 우리는 TE가 구문 분석하고, 제공할 작업을 결정하고, 해당 작업을 수행하는 방법을 결정할 수 있어야 하는 수백, 수천, 심지어 수만 개의 명령 출력 형식에 대해 이야기하고 있습니다(작업 디렉토리와 같은 것을 고려). 이후에는 쉘이 수정될 수 있습니다).
누가 이것을 시행할 것인가? 사물의 본질상 아무리 노력해도 필요한 것보다 더 자주 실패할 가능성이 있는 복잡한 경험적 방법이라는 것을 알고 계십니까? 알다분석하다특히 출력이 명시적으로 구문 분석될 수 없는 경우는 물론이고 구문 분석되도록 설계되지 않은 경우 컴퓨터 프로그래밍의 최악의 영역 중 하나입니까? 사용자가 일반적으로 사용하는 별칭 등을 가르쳐 예상대로 작동할 수 있도록 사용자가 쉽게 확장할 수 있는 방식으로 이를 설계하고 구현하는 사람은 누구일까요? 이 모든 유틸리티의 새 버전과 기능을 최신 상태로 유지하려면 누가 관리해야 합니까? 끝없이 쏟아지는 필연적인 버그 보고서를 누가 처리할 것인가? 그것은 실패할 운명이다.
이 접근 방식은 잊어버리세요. 현재와 같은 방식으로 TE 및 TE 기반 애플리케이션을 사용하는 데 익숙해지십시오.
아니면 대체 솔루션을 찾으세요.
git
직장에서 그래픽 프런트 엔드를 사용 하고 싶을 수도 있습니다 .
파일 목록과 하위 디렉터리 목록이 자주 필요한 경우 Midnight Commander 또는 다른 그래픽 파일 관리자를 찾을 수 있습니다.
터치 타이핑을 배우면 원하는 내용을 훨씬 더 빠르게 컴퓨터에 전달할 수 있으며, 더 중요한 것은 실제로 주의를 기울이는 데 방해가 되지 않는 완전히 자동적이고 무의미한 작업이 된다는 것입니다. 말하는 것만큼 자연스럽게 타이핑을 해보세요.