it-swarm-ko.tech

명령을 입력하지 않은 경우 우분투 터미널에 명령을 저장하는 방법이 있습니까?

우분투 터미널에 명령을 저장하는 빠른 방법이 있는지 궁금합니다. 시나리오는 다음과 같습니다.

문제:

  1. [긴 명령] 입력
  2. [long command]를 실행하기 전에 [다른 명령]을 실행해야한다는 것을 잊었습니다.

나중에 사용할 수 있도록 명령을 저장하여 # 이전에 위/아래 키 기록에 넣습니다. 레지스터 나 클립 보드에 직접 저장하는 것이 가장 좋습니다.

나는 또한 에코하고 싶지 않다는 것을 언급하는 것을 잊었다.

45
duckingChickens

이것은 터미널이 아니라 입니다.

찾고있는 Shell 메커니즘의 이름은 kill buffer입니다. 사람들은 셸 명령 줄 편집기에 이러한 기능이 있다는 것을 잊습니다. Z Shell의 ZLE에는 Bourne Again Shell의 GNU Readline), (FreeBSD) Almquist Shell의 libedit, Korn Shell의 라인 편집기 및 TENEX C Shell의 라인 편집기가 있습니다.

emacs 모드의이 모든 쉘에서, 저장 될 줄의 끝으로 가서 간단히 헤드 킬 버퍼로 킬하십시오. ⎈ Control+U중간 명령을 입력하고 실행 한 다음 킬 버퍼 내용을 ⎈ Control+Y. 중간 명령을 입력 할 때 킬 버퍼로 작업을 수행하지 마십시오.

vi 모드의 Z 셸에는 줄을 죽일 명명 된 vi 스타일 버퍼를 지정하기위한 vi 접두사 시퀀스가 ​​있습니다. 기본 버퍼 대신 다른 버퍼 중 하나를 사용할 수 있습니다. 단순히 다음과 같은 것을 사용하십시오 "add (vicmd 모드에서) 전체 행을 버퍼 "a"에 삭제하고 중간 명령을 입력하고 실행 한 다음 해당 버퍼의 내용을 "ap.

vi 모드에서 Korn Shell, GNU Bourne Again Shell의 Readline 및 (FreeBSD) Almquist Shell의 libedit는 vi 스타일 버퍼, 하나의 컷 버퍼 만. dd 해당 버퍼의 행을 삭제 한 다음 버퍼 내용을 p작동합니다. 그러나 중간 명령을 입력하는 동안 killing 및 yanking과 동일한 vi- 스타일 버퍼를 사용합니다.

52
JdeBP

I/O 리디렉션이있을 수 있고 여전히 실행되어 잠재적으로 파일을 덮어 쓰기 때문에 echo (또는 다른 no-op-type 명령)을 줄 앞에 추가하고 싶지 않습니다. 명령을 실행할 준비가 될 때까지 계속 액세스해야합니다.

대신 줄의 시작 부분으로 이동하여 주석 문자 #. 그럼 당신은 누를 수 있습니다 Enter, 행이 내역에 저장됩니다.

Vi 모드 인 경우 ksh 및 bash는 적어도 이에 대한 특정 명령을 갖습니다. 명령 모드 입력 (press Esc)를 누른 다음 # 캐릭터.

이것은 특히이 사용 사례를위한 것입니다. O'Reilly Korn Shell 배우기 책에서이 명령에 대한 설명은 다음과 같습니다.

행 앞에 # (주석 문자)를 붙여서 히스토리 파일로 보내십시오. 명령을 다시 입력하지 않고 나중에 실행할 명령을 저장하는 데 유용합니다. 행이 이미 #으로 시작하는 경우 여러 줄 명령에서 줄 바꿈 뒤에 나오는 # 및 기타 주석 문자를 제거하십시오.

31
user7761803

zsh을 (를) 실행중인 경우 Ctrl-QPush-line . 스택에 현재 입력 한 내용을 저장하고 프롬프트를 지우고 다음 명령을 입력 한 후 스택을 팝합니다. 나는 당신이 묘사 한 상황에 항상 이것을 사용합니다.

16
0x5453

보통 줄 끝에 " '"(작은 따옴표)를 추가하고 Enter와 Ctrl-C를 누릅니다. 나중에 커서 업 또는 Ctrl-R을 사용하여 호출합니다. 그래도 낡은 따옴표가 없는지 확인해야합니다.

6
Edheldil

쉘이 emacs mode (bash의 일반적인 기본값)으로 설정된 경우 :

#set -o | grep emacs
emacs         on

그럼 당신은 할 수 있습니다 :

<Ctrl>a or <arrowkeys> # to go to the beginning of the current line or to wherever you want
<Ctrl>k    # to "kill" the content from the cursor position to the end of the line + SAVE it
... here you type the command you forgot to add ...
<Ctrl>y    # to "yank" the SAVED line into the current editing line. or <Ctrl>p in ksh(??)
<Enter>    # to execute it

#note: you can also replace: <Ctrl>a<Ctrl>k with: <Ctrl>u # kills the whole line + SAVE it

이것은 매우 빠르며 습관이됩니다. ctrl-k는 또한 줄의 "종료"만 저장하는 데 유용 할 수 있습니다 (예 : 나중에 재사용 할 것이라는 2 개의 긴 인수, "kill"(+ save) 및 "yank"가능) 당신이 원하는만큼 자주 다시)

쉘이 vi 모드 인 경우 일반적인 vim 명령을 사용할 수 있습니다.

<Esc>      # to go back to normal(command) mode, if you were in editing mode
dd         # to delete the whole current line + SAVE it  (see note below)
i          # to reenter editing mode
... here you type the command(s) you forgot ...
<Esc>      # to return to normal mode
p          # to paste the buffered line + place the cursor on top of the last character
a          # to reenter editing mode past that current character
<Enter>    # to execute it

# note: instead of "dd" (kill whole line) you can simulate emacs <Ctrl>a<Ctrl>k with:
#    | or h or l  # to go to the 1st char of the line or wherever # simulates <Ctrl>a or <arrow keys>
#    d$  # to delete from the current position to the end of the line + SAVE it # <Ctrl>k
4
Olivier Dulac

경우에 따라 해결 방법이 있습니다.

really long command thigng -flag -flag2

홈을 누르고 새 명령을 입력 한 다음 &&를 먼저 실행하고 성공한 경우 두 번째를 실행하십시오.

first command && really long command thigng -flag -flag2

그러면 별도의 단계로 저장되지 않습니다.

또는

첫 번째 명령을 이미 입력 한 경우 (눌린 Enter와 같이) first_command && !!를 입력하면 !!에 두 번째 명령이 삽입됩니다.

4
Viktor Mellgren

GUI 또는 셸 기능을 사용하여 텍스트를 선택/복사 한 다음 텍스트를 일부 파일에 붙여 넣거나 다음 선택으로 덮어 쓰는 것을 잊지 마십시오 not 필요한 경우), 그러나 나는 어색한 것을 발견했다 : 전체 명령 행의 장소는 "상하 키 기록"에서 IMHO이다.

줄 시작 부분에 #를 추가하고 <Enter>를 누르는 대신 현재 명령 줄을 실행하지 않고 기록에 저장하는 키 바인딩을 만들 수 있습니다.

예 : bash를 사용하여 Meta/Alt-C 또는 Esc-C에 바인딩합니다 (일반적으로 emacs 키 바인딩에서 capitalize-Word에 바인딩되어 있습니다. 이미 사용중인 경우 다른 키를 사용하십시오).

bind -x '"\ec": history -s "$READLINE_LINE"; READLINE_LINE='

Vi 키 바인딩을 사용하는 경우 사용하지 않는 ^G를 스쿼트 할 수 있습니다.

bind -x '"\C-g": history -s "$READLINE_LINE"; READLINE_LINE='

그것은 또한 그 후의 선을 맑게 할 것이다. 원하지 않는 경우 (예 : ^C로 행을 수동으로 취소하는 것을 선호하는 경우) READLINE_LINE=를 생략하십시오.

3
mosvy

다양한 난해한 readline 키보드 단축키를 다루지 않고 셸의 기록 파일을 직접 편집 할 수 있습니다. bash로 :

  1. history -w (기존 기록 삭제)
  2. $EDITOR $HISTFILE (기록 파일 수정 (~/.bash_history 기본적으로) 및 원하는대로 변경)
  3. history -c ; history -r (Shell의 메모리 내 기록을 지우고 기록 파일에서 다시로드)

Bash 기록을 많이 조정하고 싶기 때문에 bash 함수를 작성하여보다 편리하게 만들었습니다.

histedit()
{
  # Flush history.
  history -w

  # Open an editor at the last line.  Pipe the file into `wc` to suppress
  # printing the filename.
  #
  # Note that some versions of `wc` (e.g. BSD) do not support long options
  # and print with leading spaces.
  last_line=$(wc -l < "${HISTFILE}")
  last_line=$(( "${last_line}" ))

  "${EDITOR}" "+${last_line}" "${HISTFILE}"

  # Reload the history file.
  history -c
  history -r
}

또한 빠른 검색을 수행하고 내 bash 기록을 대체하는 별도의 bash 기능이 있습니다 입력 한 명령을 수정하고 다시 실행합니다.

2
jamesdlin

두 번째 명령을 이미 입력 한 경우 줄의 시작 부분으로 이동하여 첫 번째 명령을 입력 한 다음 세미콜론을 입력하여 두 명령을 구분하십시오. 성공이 중요하지 않은 경우입니다. 중요하다면 && 다른 누군가가 제안했습니다.

2
WGroleau

아니요, 입력 한 명령 만 사용하므로 명령 줄 기록에 저장되지 않습니다.

그러나 "에코"를 붙여서 입력하기가 복잡한 것을 저장할 수 있습니다.

echo /usr/bin/complicate -v e -r y -c o -m p -l ic -a t -t ed

그런 다음 echo 명령을 호출하고 "echo"를 제거하도록 편집하십시오.

나중에 준비하기 위해 기록에 무언가가 필요한 경우 기록 파일을 편집 할 수도 있습니다 (예 : bash의 경우 ~/.bash_history, tcsh의 경우 ~/.history 기존 명령을 변경하여 편집하십시오. 파일 구문을 추측 할 필요가 없기 때문에 가장 쉽습니다. 다음 번에 쉘을 읽을 경우 시작합니다 (쉘이 대부분의 시스템에서 기본적으로 발생하는 히스토리를 저장하고 읽도록 구성되어있는 경우).

많은 타이핑없이 복잡한 명령을 사용하는 세 번째 방법은 명령의 별칭을 정의하는 것입니다. 다시 구문은 Shell 변형에 따라 다릅니다.

세게 때리다:

alias ll='ls -algF --color=auto'

tcsh :

alias ll 'ls -algF --color=auto'

새로운 명령 llls -algF --color=auto를 입력하는 것과 동일합니다. 매개 변수없이 alias을 실행하여 기존 별명 (예 :)을 볼 수 있습니다.

이 줄은 ~/.bashrc~/.tcshrc에 입력 할 수 있으며, 모든 셸 스타트 업을 위해 저장할 수 있습니다.

1
Ned64