실행 전에 편집되는 미리 채워진 명령과 같이 명령줄에 문자열을 삽입하는 명령

실행 전에 편집되는 미리 채워진 명령과 같이 명령줄에 문자열을 삽입하는 명령

아래 예에서 $bash 프롬프트 로 Enter 키를 누르는 것을 상징하기 위해 명령/별칭을 어떻게 구성합니까 foo?

$ foo bar⏎

Enter 키를 누르기 전에 "bar"를 수정할 수 있도록 "bar"(또는 명령에 전달하는 다른 문자열)가 명령줄에 입력/입력/미리 채워지거나 입력됩니까? 예를 들어

$ bar
$ barbaz⏎ 

시도했지만 성공하지 못했고 echo bar > /dev/pts/123하고 싶지 않습니다 xdotool. 가능합니까?


편집: 사용 사례 예, "greppy 자동 완성":

기억하기 어려운 매개변수가 많이 포함된 긴 명령이 필요한 경우가 많습니다. 예제를 파일에 저장합니다.

명령.txt:

ffmpeg -i infile.mp4 -c:v copy -c:a copy -y transcoded.mp4
sox in.wav out.wav remix 1 0

이제 위에 지정된 명령이 있으면 이를 이라고 부르겠습니다 inject. 별칭을 가질 수 있습니다.

grepcomplete () {
  inject $(grep $0 commands.txt)
}

그래서 내가 기억할 때 나는 필요하다혼합뭔가 그런데 기억이 안 나네요삭스해당 매개변수를 입력한 grepcomplete remix다음 sox in.wav out.wav remix 1 0입력한 것처럼 명령줄에 앉아 편집하고 조정할 준비가 된 다음 Enter 키를 눌러 실행할 수 있습니다. 아무것도 선택, 복사, 붙여넣기할 필요가 없습니다.

Kamil이 의견에서 제안한 것처럼 bash의 기록 검색(Ctrl-R)을 사용하고 history -r commands.txtbashrc에서 비슷한 작업을 수행하여 나만의 "기록"을 제공할 수 있습니다.
그래도 내 접근 방식의 좋은 점은 예를 들어 구문 강조를 통해 모든 일치 항목을 표시하여 쉽게 해킹할 수 있다는 것입니다.

내가 이 질문에 직접 대답하고 이 명령의 구현을 제공했다는 점에 유의하십시오 inject.

답변1

다음은 다음에서 영감을 얻은 작고 추악한 솔루션입니다.Perl 솔루션을 통해 각 프롬프트 뒤에 문자열 삽입, TIOCSTI 사용파이썬에 적응하다:

다음과 같은 bash 기능.bashrc

inject () {
(python -c "import fcntl; import termios; import sys
with open('/dev/stdout', 'w') as fd:
  for c in ' '.join(sys.argv[1:]): fcntl.ioctl(fd, termios.TIOCSTI, c)" "$@" &)
}

용법:

inject foo bar

노트:

  • 지금은 유니코드를 처리할 수 없습니다! for char in str범인이 의심되는데요 ?
  • 서브셸의 배경 구조( foo &) 프롬프트 전에 문자열의 이중 반향 방지
  • 인수 사이의 공백을 먹습니다: inject foo bar= inject foo bar. 사용 inject "foo bar".
  • 타이밍에 따라 다르므로 경쟁 조건이 있을 수 있는 것 같나요?
  • bash 하위 쉘 없이 수행할 수 있고 파이프, xargs 등에 더 적합할 수 있는 Python 스레딩/다중 처리 기능이 있는 다른 버전이 있습니다. 이것은 내 사용 사례에 가장 깨끗하고 간단한 솔루션입니다.

답변2

를 사용하여 구성할 수 있습니다 ~/.inputrc. 파일이 없으면 파일을 만들고 다음 내용을 추가합니다.

Control-P: "foo "

이제 새 터미널을 열고 Ctrl+를 누르면 커서가 있는 곳에 P문자열이 foo입력됩니다. 자신에게 맞는 단축키를 선택할 수 있으며 작동해야 합니다.

답변3

xdotoolTTY 쉘이 아닌 X 환경에서만 작동하며 Wayland에서는 작동하지 않을 수도 있습니다.


나는 당신이 질문하고 있는 것 같은 느낌이 듭니다나만의 bash 완성 스크립트 만들기. 그런 다음 키를 "주입"(통화 완료)합니다 Tab.

기본 아이디어는 사용자가 키를 누를 때 bash가 제안하는 내용을 complete나타내는 다음 명령 입니다.Tab

$ complete -W "now tomorrow never" dothis

그런 다음 입력하십시오.

$ dothis to<Tab>

채우기:

$ dothis tomorrow

귀하의 예를 들어,

$ complete -W bar foo
$ foo<Space><Tab>

생산할 것이다

$ foo bar

추가로 편집할 수 있습니다.

명령 자체는 대화형 셸 생성 중에 실행될 complete수 있습니다 .~/.bashrc

답변4

Fish에서는 이 기능을 사용하는 것과 동일합니다 commandline. 예를 들어:

commandline 'echo next command'

관련 정보