프로그래밍 방식으로 텍스트 조각을 bash의 명령줄 버퍼에 넣고 편집을 위해 읽고 명령으로 사용하고 싶습니다.
내가 기대했던 것은 read -i
명령과 비슷한 것이었습니다.
-i text
readline을 사용하여 행을 읽으면 편집이 시작되기 전에 텍스트가 편집 버퍼에 배치됩니다.
편집하다: 그리고프로그래밍 방식으로내 말은 원한다는 거야이것을 스크립트에 넣어라, 스크립트를 시작하고 명령 버퍼를 준비하거나 명령 기록을 수정합니다(일부 질문에서 알 수 있듯이).
답변1
이상한 방법을 찾았어요fzf 예시 페이지. 이것은 bash 4.3 및 Perl 5.18에서 작동합니다.
writecmd () {
perl -e 'ioctl STDOUT, 0x5412, $_ for split //, do{ chomp($_ = <>); $_ }' ;
}
# Example usage
echo 'my test cmd' | writecmd
명령을 표준 출력으로 인쇄하지만 명령 버퍼에도 복사합니다. 명령을 직접 실행하려는 경우 링크된 페이지에 예제도 있습니다.
답변2
이것이 readline 바인딩에서 사용하려는 함수라면bind -x
그런 다음 수정할 수 있습니다READLINE_LINE
. (예)
readline 바인딩 외부에서 다음을 사용하여 가짜 명령을 기록에 푸시할 수 있습니다.history -s
.
답변3
Giles의 대답은 정확하지만 완전히 만족스럽지는 않습니다. 질문을 읽었을 때 OP는 다음 입력 줄을 "사전 설정"하고 싶었습니다. 제 경우에는 PROMPT_COMMAND 함수에서 터미널의 현재 위치를 읽어보고 싶습니다. 이것은 작동하지만 기본 셸과 동일한 읽기 버퍼를 사용하므로 함수에서 "읽기" 내장 호출을 수행하여 모든 사용자 입력이 삭제됩니다. 그래서 사용자 입력을 별도로 읽고 터미널에서 읽게 한 다음 읽은 입력을 입력 버퍼에 다시 넣고 싶습니다. 이는 원래 질문이었습니다. 이는 실제로 동일한 프로세스 내에 있으므로 이론적으로는 가능해야 합니다.
내가 아는 한(내 bash 4.2에는) 입력 스택에 무언가를 프로그래밍 방식으로 푸시하는 기능이 없습니다. zsh에서는 "print -z"를 사용하십시오.
따라서 대답은 다음과 같습니다. 이것은 bash에서는 불가능합니다. 이를 달성하려면 zsh를 사용해야 합니다.
답변4
대안으로 다음을 history -s 'foo'
시도해 보십시오.
echo 'foo' >> ~/.bash_history
history -n
# or
history -s 'foo'
history -a
history -n