[bash] 현재 쉘 명령을 실행하지 않고 어떻게 편집합니까?

“edit-and-execute-command (Cx Ce)”를 사용하여 편집기를 사용하여 명령을 편집하고 실행하는 방법에 대해서는 상당히 많은 정보가 있지만 현재 셸 명령을 사용하여 적용하고 싶습니다. 특정 필터링 (스크립트 사용)을 실행 한 후 실행 전에 추가 승인 / 수동 변경을 요청하는 메시지를 표시하도록 반환합니다. bash로 가능합니까?



답변

내 경험에 대한 최신 업데이트

0"+y$dd다음 매핑 의 일부 는 실제로 신중하게 생각하고 취향 / 워크 플로우 / 경험에 맞게 조정 해야하는 것입니다.

예를 들어, 매우 자주 버퍼에서 여러 줄로 끝나는 것을 발견했습니다. 여기서 커서가있는 줄만 실행하려고합니다. 이 경우 0"+y$dd:%d<CR>대신 사용할 수 있습니다 0"+y$dd.

그리고 이것은 가능한 시나리오 중 하나 일뿐입니다.

좋아하는 사람들을위한 최종 답변 vim

원래 답변

나는 종종 똑같이해야하며 다음과 같이합니다. (I 일반적으로 사용 set -o vi에서를 bash사용하는 경우 다음의 점 1과 2는 다른, 그래서 set -o emacs이 통일되는 점 1과 2과 같은 질문을 기반으로, 기본 Ctrl+ x다음 Ctrl+ e입력 어렵습니다, 이럴 .)

  1. 히트 Escape정상 모드로,
  2. 공격 v명령을 편집 에디터를 입력,
  3. 내가 원하는대로 명령을 편집

(여기서 질문하십시오.)

  1. 히트 Escape0"+y$dd:wq,
    • 참고 : 0"+y$, 단순히 "+yy, 후자는 너무 줄 바꿈을 복사 할 것이고,이 명령 행에 붙여 넣기에 명령을 실행 초래하는 것처럼,
  2. 명령 행에 클립 보드 붙여 넣기
    • 이 작업을 수행하는 방법은 사용중인 터미널에 따라 다릅니다. 나는 명중 Ctrl+ Alt+ v에서 URxvt.
  3. 승인 / 수동 편집으로 진행하십시오.

분명히 이것은 전체 명령을 삭제하기 전에 편집 된 명령을 클립 보드에 복사하여 편집기를 종료 할 때 아무것도 실행되지 않도록하는 해결 방법 일뿐입니다. 그러나 내가 직접 얻을 수있는 최선입니다.

최신 정보

EDITOR(및 VISUAL)가와 같으 vim므로 명령을 편집 할 때에서 편집하십시오 vim.

이 점에서, 나는 버퍼의 이름은 것을 눈치 챘을 /tmp/bash-fc.random경우, random6 자 영숫자 임의의 문자열입니다.

vim편집기로 사용 .vimrc하는 경우 전체 시퀀스를 실행 하기 위해 일부 매핑을 정의 할 수 있기 때문에 이것은 많은 가능성에 공간을 제공합니다 Escape0"+y$dd:wq. 예를 들어, 명령 행을 편집 할 때 거의 사용하지 않는 명령은 Leaderd; 따라서 파일에 다음 map핑을 넣을 수 .vimrc있습니다

au BufEnter /tmp/bash-fc.* nn <Leader>d 0"+y$dd:wq<CR>

위 레시피의 4 단계가

  1. 히트 EscapeLeaderd

답변

Bash / readline에서는 그렇게 할 수 없지만 zsh에서는 edit-command-linecommand를 사용하여 가능합니다 .

darkstar% autoload edit-command-line; zle -N edit-command-line
darkstar% bindkey "^X^E" edit-command-line

이제 언론은 Controlx Controle, 편집, 라인 편집기를 열고 편집기를 떠날 – 업데이트 된 명령 줄을 볼 수 있지만, 자동으로 실행되지 않습니다.


답변

이제 그것에 대해 생각할 때, @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에는 명령을 실행하지 않고 기록에서 수정하는 옵션이 있습니다. 스크립트를 사용할 수 있는지 확실하지 않습니다. 히스토리 수정자를 사용하여 수정할 수 있습니다.

  1. 수정 된 명령이 실행되지 않도록 histverify 옵션 사용
  2. 수정 자 체인을 사용하여 마지막 명령 변경
  3. 사용하다 “!!” 최종 편집을 위해 결과를 명령 줄에 넣습니다.

그 모습은 다음과 같습니다.

$ 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