“edit-and-execute-command (Cx Ce)”를 사용하여 편집기를 사용하여 명령을 편집하고 실행하는 방법에 대해서는 상당히 많은 정보가 있지만 현재 셸 명령을 사용하여 적용하고 싶습니다. 특정 필터링 (스크립트 사용)을 실행 한 후 실행 전에 추가 승인 / 수동 변경을 요청하는 메시지를 표시하도록 반환합니다. bash로 가능합니까?
답변
내 경험에 대한 최신 업데이트
0"+y$dd
다음 매핑 의 일부 는 실제로 신중하게 생각하고 취향 / 워크 플로우 / 경험에 맞게 조정 해야하는 것입니다.
예를 들어, 매우 자주 버퍼에서 여러 줄로 끝나는 것을 발견했습니다. 여기서 커서가있는 줄만 실행하려고합니다. 이 경우 0"+y$dd:%d<CR>
대신 사용할 수 있습니다 0"+y$dd
.
그리고 이것은 가능한 시나리오 중 하나 일뿐입니다.
좋아하는 사람들을위한 최종 답변 vim
- /
vim
로 설정 하면 명령 줄을 편집 할 때 편집하는 데 사용 됩니다.EDITOR
VISUAL
vim
- ” 명령을 편집 할 때 거의 사용하지 않는) 파일을 ” 후행 EOL없이 레지스터 에서 현재 행을 삭제하십시오 “조치 에 맵핑
au BufEnter /tmp/bash-fc.* nn <Leader>d 0"+y$dd:wq<CR>
할~/.vimrc
파일을 넣으십시오 .Leaderd
+
vim
편집기 에서 명령 편집을 마치면를 누르십시오 EscapeLeaderd.- 클립 보드를 터미널에 붙여 넣습니다 (이것은 터미널에 따라 다릅니다).
원래 답변
나는 종종 똑같이해야하며 다음과 같이합니다. (I 일반적으로 사용 set -o vi
에서를 bash
사용하는 경우 다음의 점 1과 2는 다른, 그래서 set -o emacs
이 통일되는 점 1과 2과 같은 질문을 기반으로, 기본 Ctrl+ x다음 Ctrl+ e입력 어렵습니다, 이럴 .)
- 히트 Escape정상 모드로,
- 공격 v명령을 편집 에디터를 입력,
- 내가 원하는대로 명령을 편집
(여기서 질문하십시오.)
- 히트 Escape0"+y$dd:wq,
- 참고 : 0"+y$, 단순히 "+yy, 후자는 너무 줄 바꿈을 복사 할 것이고,이 명령 행에 붙여 넣기에 명령을 실행 초래하는 것처럼,
- 명령 행에 클립 보드 붙여 넣기
- 이 작업을 수행하는 방법은 사용중인 터미널에 따라 다릅니다. 나는 명중 Ctrl+ Alt+ v에서
URxvt
.
- 이 작업을 수행하는 방법은 사용중인 터미널에 따라 다릅니다. 나는 명중 Ctrl+ Alt+ v에서
- 승인 / 수동 편집으로 진행하십시오.
분명히 이것은 전체 명령을 삭제하기 전에 편집 된 명령을 클립 보드에 복사하여 편집기를 종료 할 때 아무것도 실행되지 않도록하는 해결 방법 일뿐입니다. 그러나 내가 직접 얻을 수있는 최선입니다.
최신 정보
내 EDITOR
(및 VISUAL
)가와 같으 vim
므로 명령을 편집 할 때에서 편집하십시오 vim
.
이 점에서, 나는 버퍼의 이름은 것을 눈치 챘을 /tmp/bash-fc.random
경우, random
6 자 영숫자 임의의 문자열입니다.
vim
편집기로 사용 .vimrc
하는 경우 전체 시퀀스를 실행 하기 위해 일부 매핑을 정의 할 수 있기 때문에 이것은 많은 가능성에 공간을 제공합니다 Escape0"+y$dd:wq. 예를 들어, 명령 행을 편집 할 때 거의 사용하지 않는 명령은 Leaderd; 따라서 파일에 다음 map
핑을 넣을 수 .vimrc
있습니다
au BufEnter /tmp/bash-fc.* nn <Leader>d 0"+y$dd:wq<CR>
위 레시피의 4 단계가
- 히트 EscapeLeaderd
답변
Bash / readline에서는 그렇게 할 수 없지만 zsh에서는 edit-command-line
command를 사용하여 가능합니다 .
darkstar% autoload edit-command-line; zle -N edit-command-line
darkstar% bindkey "^X^E" edit-command-line
이제 언론은 Control– x Control– e, 편집, 라인 편집기를 열고 편집기를 떠날 – 업데이트 된 명령 줄을 볼 수 있지만, 자동으로 실행되지 않습니다.
답변
이제 그것에 대해 생각할 때, @kenorb가 의견에서 제안한 것의 변형이 해결책이없는 것처럼 보이는 가장 좋은 해결 방법 일 것 bash
입니다.
수행 할 수있는 작업은 명령이 아닌 명령 앞에 #
((의 주석 문자 bash
)를 추가하는 것 echo
입니다. 당신이 exitor를 종료 할 때 그런 다음 명령은 비 효과적 일 것입니다, 당신은 단지 언론해야합니다 arrow up(또는 k, 당신이 사용하는 경우 set -o vi
), 제거 #
및 확인합니다.
이 전략은 몇 번의 키 입력 만 추가하므로 입력 수준에 따라 상당히 효율적일 수 있습니다.
답변
이 조각들은 더 가까이 갈 수 있습니다 :
a) 줄 바꿈 개행에 대한 정상적인 바인딩을 대체하십시오 (ctrl-M)
bind -x '"\C-M":date"
b) 다음을 사용하여 내역에서 현재 줄을 가져옵니다. !#
원하는 스크립트로 날짜를 바꾸십시오.
c) 수동으로 편집
d) 필요한 경우 !!:p
새 명령을 명령 행에 인쇄하지만 실행하지 않는 방식으로 연결하여 수동으로 편집 할 수 있습니다.
e) 줄 바꿈 대신 ctrl-J submit 편집 명령 사용
아니면 그들은 ….
답변
bash에는 명령을 실행하지 않고 기록에서 수정하는 옵션이 있습니다. 스크립트를 사용할 수 있는지 확실하지 않습니다. 히스토리 수정자를 사용하여 수정할 수 있습니다.
- 수정 된 명령이 실행되지 않도록 histverify 옵션 사용
- 수정 자 체인을 사용하여 마지막 명령 변경
- 사용하다 “!!” 최종 편집을 위해 결과를 명령 줄에 넣습니다.
그 모습은 다음과 같습니다.
$ shopt -s histverify
$ ls *.sh
script1.sh script2.sh script3.sh script-return.sh
$ !!:s/*/script1/:p
ls script1.sh
$ !!:s/1/2/:p
ls script2.sh
$ !!
$ ls script2.sh
script2.sh
답변
Bash 의 Composure 프레임 워크를 알려 드리고자합니다 (나는 관련이 없습니다) : https://github.com/erichs/composure
그것은 제공 draft
하고 revise
사운드 그들은 당신이 뭘 하려는지에 도움이 될 수 같은 것을 기능. 다음은 프로젝트의 readme 파일에서 인용 한 것입니다.
Composure는 간단한 쉘 기능을 빠르게 작성하여 긴 파이프 필터와 복잡한 명령을 읽기 쉽고 재사용 가능한 덩어리로 나눌 수 있도록 도와줍니다.
먼저 작성하고 나중에 질문하십시오
명령의 보석을 만들었 으면 버리지 마십시오!
draft ()
좋은 이름을 사용하십시오
. 마지막 명령을 나중에 다시 사용할 수있는 기능으로 저장합니다. 초안처럼 생각하십시오.$ cat servers.txt bashful: up doc: down up-arrow $ cat servers.txt | grep down doc: down $ draft finddown $ finddown | mail -s "down server(s)" admin@here.com
수정, 수정, 수정!
최소한의 쉘 기능을 갖추 었으므로 리팩토링 및 수정을 통해 더 나은 기능을 만들고 싶을 수 있습니다. 이
revise ()
명령을 사용 하여 선호하는 편집기에서 쉘 기능을 수정하십시오.
- 입력 매개 변수로 함수를 일반화
- 기능 추가 또는 제거
문서화를위한 지원 메타 데이터 추가
$ revise finddown finddown () { about finds servers marked 'down' in text file group admin cat $1 | grep down } $ finddown servers.txt doc: down
답변
최소한 키보드 단축키로는 가능하지 않은 것 같습니다.
$ bind -P | grep -e command -e edit
complete-command can be found on "\e!".
edit-and-execute-command can be found on "\C-x\C-e".
emacs-editing-mode is not bound to any keys
possible-command-completions can be found on "\C-x!".
vi-editing-mode is not bound to any keys