bash 명령 행 버퍼에 텍스트를 넣습니다. 편집하여 명령으로 사용하고 싶습니다. 내가 기대하는 것은 read

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

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

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

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



답변

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


답변

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

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


답변

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

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

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


답변

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

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

# or
history -s 'foo'
history -a
history -n