bash 명령 행 버퍼에 텍스트를 넣습니다.


9

프로그래밍 방식으로 bash의 명령 줄 버퍼에 특정 텍스트 조각을 넣고 편집하여 명령으로 사용하고 싶습니다.

내가 기대하는 것은 read -i명령 과 비슷 하지만 명령입니다.

-i text readline을 사용하여 행을 읽는 경우 편집을 시작하기 전에 텍스트가 편집 버퍼에 배치됩니다.

편집 : 프로그래밍 방식 으로 스크립트작성하고 스크립트 를 시작하고 명령 버퍼를 준비하거나 명령 기록을 수정하십시오 (일부 질문에서 제안한 것처럼).


IIRC screen가 당신을 위해 이것을 할 수 있습니다.
strugee

답변:


6

fzf 예제 페이지 에서 이것을 수행하는 해키 방법을 찾았습니다 . 이것은 bash 4.3 및 perl 5.18에서 작동합니다.

writecmd () { 
  perl -e 'ioctl STDOUT, 0x5412, $_ for split //, do{ chomp($_ = <>); $_ }' ; 
}

# Example usage
echo 'my test cmd' | writecmd

stdout에 명령을 인쇄하지만 명령 버퍼에도 복사합니다. 명령을 직접 실행하려는 경우 링크 된 페이지에도 예제가 있습니다.


이 답변은 OP가 요청한 내용과 가장 비슷합니다.
reza.safiyat

약간 다른 구문 이 대답은 , &TIOCSTI보다 비트 좋네요 0x5412너무. 일부 플랫폼 (예 : OpenBSD )이 TIOCSTI를 비활성화하는 것처럼 들립니다. 나는 이것이이 접근법과 zsh가 모두 print -z작동하지 않는다는 것을 의미한다고 생각합니다 .
dimo414

4

readline 바인딩에 사용할 함수의 경우이를 bind -x수정할 수 있습니다 READLINE_LINE. ( )

readline 바인딩 외부에서을 사용하여 가짜 명령을 기록에 푸시 할 수 있습니다 history -s.


문제는 내가 history -s 'foo'스크립트를 사용하면 시작된 쉘의 역사가 전혀 수정되지 않는다는 것입니다.
gioele

@gioele 셸 내에서 시작해야합니다 (예 :로로드하는 스크립트에서 source). 별도의 프로세스에서 아무것도 할 수 없습니다.
Gilles 'SO- 악마 그만해'

2

Gilles의 답변은 정확하지만 완전히 만족 스럽지는 않습니다. 이 질문을 읽으면서 OP는 다음 입력 줄을 "미리보기"를 원합니다. 필자의 경우 PROMPT_COMMAND 함수에서 터미널의 현재 위치를 읽으려고했습니다. 그것은 작동하지만 기본 셸과 동일한 읽기 버퍼를 사용하므로 함수에서 '읽기'내장 호출을했기 때문에 모든 사용자 입력이 삭제됩니다. 따라서 사용자 입력을 개별적으로 읽고 터미널을 읽은 다음 원래 입력 인 입력 버퍼에 읽기 입력을 다시 넣고 싶었습니다. 이것은 실제로 동일한 프로세스 내에 있으므로 이론적으로 가능해야합니다.

내가 볼 수있는 한 (내 bash 4.2에서) 프로그래밍 방식으로 입력 스택에 무언가를 푸시하는 기능이 없습니다. zsh에는 'print -z'가 사용됩니다.

그래서 대답은 : bash에서는 불가능합니다. zsh를 사용해야합니다.


0

history -s 'foo'시도 하는 대안으로 :

echo 'foo' >> ~/.bash_history
history -n

# or
history -s 'foo'
history -a
history -n
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.