bash 스크립트 출력을 bash 스크립트를 호출하는 줄로 설정

bash 스크립트 출력을 bash 스크립트를 호출하는 줄로 설정

나는 bash 스크립트의 출력을 bash 스크립트를 호출하는 줄로 리디렉션하는 방법을 찾을 수 있는지 알아보기 위해 2시간의 대부분을 보냈습니다.

내가 찾고 있는 것을 설명하는 데 사용할 수 있는 가장 좋은 예는 [TAB]을 누를 때 실행되는 완성 함수입니다.

$ech[tab] #--> $echo  

#-->"echo"라는 단어를 완성하는 방법을 나타내야 한다는 점을 지적해야 합니다 .

내가 찾을 수 있는 가장 가까운 방법은 일부 옵션을 "에코"로 설정하여 \b\b읽을 수 있고 stdout이 동일한 줄을 업데이트할 수 있도록 하는 것입니다. 그러나 그것은 내가 찾고 있는 것이 아닙니다. 콘솔 입력에서 현재 라인이나 다음 라인으로 직접 출력할 수 있게 하고 싶습니다. bash 스크립트로도 가능합니까?

편집하다:

답변해주신 모든 분들께 감사드립니다. 원래 질문을 업데이트하고 질문 제목 자체도 변경해야 할 것 같습니다.

내 질문의 범위는 다음과 같이 변경되었습니다. 더 이상 스크립트만으로 무엇을 달성할 수 있고 무엇을 달성할 수 없는지에 대한 질문이 아닙니다. 나의 초기 목표는 완성 "기능"을 시뮬레이션하는 것이었고 점차적으로 이것이 실제로는내장 bash 명령.

(bash의 탭 완성 명령을 에뮬레이션하기 시작하기 위해) 내가 알아야 할 특정 라이브러리는 다음과 같습니다.리딩라인 도서관. bash 완성 자체는 C(++?)로 구현됩니다.

어쨌든, 귀하의 통찰력 있는 답변에 다시 한 번 감사드리며, 위 기사에서 언급한 것 외에 다른 팁이 있는 경우(아마도 Readline 또는 Completion 라이브러리를 개인적으로 사용하여 얻은 정보일 수 있음) 귀하의 의견을 읽기를 기대합니다.

답변1

나는 이 문제를 두 가지 방식으로 해석할 수 있습니다. 이미 터미널에 작성된 내용을 다른 것으로 덮어쓰려는 것(쉽게 수행됨) 또는 현재 대화형 쉘 입력을 프로그래밍 방식으로 제공하려는 것 같습니다.

문제는 이 질문들이 궁극적으로 매우 다른 두 가지를 의미한다는 것입니다. 많은 사람들이 저지르는 실수(어차피 하나 만들었지만 - 반복적으로)이는 터미널 화면에 인쇄된 시각적 문자를 키보드에서 입력한 입력과 동일시하는 것입니다. 그러나 현실은 키보드가 화면의 출력보다 작업하기가 더 쉽다는 것입니다. 전자를 후자로 변환하려면 둘 사이에 수행해야 할 작업이 많습니다. 터미널에서 인쇄하는 것은 편리하지만 종종 거짓말을 합니다.

셸에 입력을 제공하려는 경우 화면에 쓰는 것이 도움이 되지 않을 수 있습니다. 물론 이렇게 할 수도 있습니다. 터미널 라인 위로 이동하기 위해 표준 VT102+ 이스케이프 시퀀스를 실행하는 것은 다음과 같습니다.

printf '\033[A'

...하지만 이렇게 하면 별 일이 일어나지 않는 것 같습니다. 쉘이 이를 읽지 않기 때문입니다.글쓰기당신과 같은 장소로 가십시오. 넌 할 수있어:

printf '\033[A'; cat

...실제로 그것이 무엇을 하는지 보십시오. cat이렇게 하면 쉘이 즉시 새로운 프롬프트를 그리는 것을 방지할 수 있습니다. 당신은 할 수(아마도)[대괄호와 A여러 줄 사이에 숫자 매개변수를 추가합니다. 아래로 B, 왼쪽으로 D, 오른쪽으로 갈 수 있습니다 C. 찾을 수 있는 시퀀스 tput와 함께 호출 결과를 명명된 변수에 저장하는 것은 일반적으로 사람들이 수행하는 방식이며 실제로도 그렇습니다. 터미널은 흥미로운 것입니다.termcapman termcap

정말 재미있는 시간을 보내고 싶다면 다음을 시도해 보세요.

stty raw isig -echoctl; cat >/dev/null

xterm호환되는 터미널 에뮬레이터에서( stty지원 이 제공되지만 -echoctl그렇지 않은 경우에는 필요하지 않습니다.)기본적으로 화살표 키를 사용하여 터미널 화면 주위를 이동하고 텍스트를 입력할 수 있어야 합니다. 그러나 그 중 어느 것도 중요하지 않습니다. 왜냐하면 디스플레이를 재정의하고 있기 때문입니다. 쉘은 그것에 대해 전혀 신경 쓰지 않습니다.

쉘에 영향을 주고 싶다면 쉘의 표준 입력과 대화해야 합니다. 대화형 쉘은 일반적으로 호출할 때 미리 알려주지 않는 한 이와 관련하여 사용자가 말하는 내용을 많이 듣지 않습니다. 그렇지 않으면 키보드 소리만 듣습니다. 그게 바로 키보드 소리입니다.(더 정확하게 말하면 키보드가 표준 입력입니다.). 하지만 당신에게는 선택의 여지가 있습니다.

대화형 쉘 입력 스크립트를 작성하는 좋은 방법은 이를 지연시키는 것입니다. 예를 들어, 기본적으로 아무것도 하지 않고 키보드 입력을 받아들이고 다음과 같은 내용을 에코하는 더미 프롬프트를 얻을 수 있습니다 stderr.

sh -niv 2>&1 >/dev/null | ...

그것은 당신의 것일 필요도 없습니다 /bin/sh. 그것은 잘 작동할 것 bash입니다. 모든 일반적인 작업(명령 기록 포함 )을 bash수행 하지만 특정 작업을 수행 하고 모든 입력을 파이프에 자세히 인쇄합니다. 그런 다음 원하는 방식으로 방향을 지정할 수 있습니다. 약간의 필터링을 거친 후 다른 파이프를 통해 다른 파이프로 연결할 수도 있습니다.readline$PS1-n-vbash

이런 일을 많이 할 수 있지만 과거로 돌아갈 수는 없습니다. 스크립트가 시작된 후 마지막 명령이 종료되었습니다. 변경할 수는 없지만 향후 명령을 필터링하도록 정렬할 수 있습니다.

관련 정보