역사 명령

역사 명령

터미널에서 자주(어떤 답변이라도 bash 및 대부분의 다른 곳에서 작동할 것으로 예상하지만) 일부 명령을 입력한 다음 누락으로 인해 일종의 권한 오류가 발생합니다 sudo.

좋습니다. '위쪽'을 누르고 '왼쪽'을 누른 상태에서 망치를 누른 다음 입력 sudo하고 'Enter'를 누르세요.

짜증난다. 더욱이 명령이 길어졌습니다.

누락은 sudo최악의 경우입니다. 끝보다 시작 부분에 가까운 오타도 마찬가지로 짜증납니다..

내가 원하는 것은 일종의 '위쪽 및 홈' 키 입력을 수행하는 방법입니다. 실제로는 두 번의 스트로크만으로 충분할 것입니다. 하지만 제 Macbook 키보드에는 홈이 없어서 시도해 볼 수 없습니다.

sudoCMD+Shift+S와 같이 자동으로 'Enter'를 삽입하고 누르는 방법에 대한 보너스 포인트 도 있습니다.


이것이 가능할까요, 아니면 제가 꿈을 꾸고 있는 걸까요?

답변1

간단하게 UP및 를 사용하세요 CTRL-A.

둘 다 !sudo기능 sudo !!이 쉽습니다. 차이점은 다음과 같습니다.

  • sudo !!sudo처음부터 기록에서 가져온 마지막 명령을 실행합니다 .

  • !sudo로 시작된 기록의 마지막 명령을 실행합니다 sudo.

  • 일반적으로 CTRL-ALinux 터미널의 줄 시작 부분과 CTRL-E끝 부분에 표시됩니다.
    원한다면 계속해서 전략을 사용할 수 있습니다. 시스템의 바로가기를 발견하기만 하면 됩니다. 당신은 목록을 찾을 수 있습니다단축키그래픽 및 텍스트 환경에서예를 들어 여기.

오직경고: 기능 sudo !!!sudo정말 빠르고슈퍼유저로 실행 중인 라인을 시각적으로 제어할 수 없습니다.. 이로 인해 발생할 수 있는해로운때때로. 특히 인쇄 오류가 발생한 경우.

극적인 예를 들어보겠습니다.

cd $HOME/Directory_To_Delete  # You go to delete what is inside a directory
rm -rf . ; cd ..              # You do it and go up of one
 apt-get update               # Note the space in the beginning of the line  
sudo !!                       # Gone!! Now you realize you never really wanted 

너무 늦게 홈 디렉토리와 모든 하위 폴더를 지웠습니다 !!.

공백을 첫 번째 문자로 사용하여 명령을 작성하면 기록에서 끝나지 않을 수 있습니다. 이는 $HISTControl 변수의 값에 따라 달라집니다. 해당 값 목록에 다음이 포함된 경우무시 공간(또는둘 다 무시) 공백 문자로 시작하는 줄은 기록 목록에 저장되지 않습니다. 그래서 sudo로 !! 이전에 마지막 명령을 실행하게 됩니다.

와 비슷한 상황을 상상할 수 있습니다 !sudo. 기록에 기록된 것으로 시작하는 마지막 명령을 실행 sudo하지만 기억하는 마지막 명령이 공백으로 시작했다면... 이제 다른 명령을 사용하게 될 것입니다.

마지막 참고 사항: 실수가 적다는 것은 당신이 눈치채지 못한 채 지나갈 수 있기 때문에 더 악랄할 수 있습니다... 그리고 당신이 기억할 수 없는 청구서의 모든 이자를 지불하라는 요청을 받을 위험이 있습니다.


업데이트(Bash는 훌륭합니다):
최신 버전의 Bash에서는 파일에 넣으라고 제안하는 다음 명령을 사용하여 이 위험한 동작을 수정할 수 있습니다 ~/.bashrc.

shopt -s histverify

당신 부터 man bash읽을 수 있습니다

만약역사를 검증하다쉘 옵션이 활성화되어 있고판독선사용되고 있으며,히스토리 대체는 쉘 파서에 즉시 전달되지 않습니다.대신, 확장된 줄은 추가 수정을 위해 readline 편집 버퍼에 다시 로드됩니다.

따라서 실행할 명령을 읽고 필요할 때 수정할 수 있습니다.
많은 배포판에서 기본 설정이 아니기 때문에다른 계정을 사용할 때에도 이를 기억해야 합니다.

답변2

다음은 많은 Mac 및 Linux 프로그램에서 사용하는 몇 가지 일반적인 키보드 조합입니다(그러나 대부분의 Windows 앱에서 어떤 조합을 따르는지는 확실하지 않습니다).

  • CTRL-A- 커서를 현재 줄의 시작 부분으로 이동
  • CTRL-E- 커서를 현재 줄의 끝으로 이동
  • CTRL-Left- 커서를 한 단어 뒤로 이동
  • CTRL-Right- 커서를 한 단어 앞으로 이동

답변3

사용

sudo !!

!!이전 명령 전체로 대체됩니다.

답변4

@WChargin이 에 대해 정확 !sudo하므로 답변을 변경하겠습니다...

sudo !!많은 사람들이 말했듯이 정답입니다.

history혹시라도 명령과 해당 명령이 작동하는 방식 에 관해 다음 내용을 여기에 붙여넣습니다 !. 이게 도움이 되길 바란다.


역사 명령

History 명령을 사용하면 사용자가 입력한 명령에 대한 Bash의 로그를 나열할 수 있습니다.

이 로그를 "기록"이라고 합니다. 액세스하려면 다음을 입력하세요.

history n 

마지막 n개의 명령만 나열됩니다. 전체 기록 목록을 보려면 "history"(옵션 없이)를 입력하세요.

다음을 입력할 수도 있습니다.!nn번 명령을 실행합니다. 사용!!마지막으로 입력한 명령을 실행합니다.

!-n이전에 명령을 n 번 실행합니다(즉,!-1는 다음과 같습니다!!).

!string해당 "문자열"로 시작하는 마지막 명령을 실행하고 !?string?"string"이라는 단어가 포함된 마지막 명령을 실행합니다. 예를 들어:

!cd"cd"로 시작하여 마지막으로 입력한 명령을 다시 실행합니다.

commandName !*마지막 명령에 사용한 인수를 사용하여 "commandName"을 실행합니다. 예를 들어 철자법을 틀리는 경우에 유용할 수 있습니다. 다음을 입력한 경우:

emasc /home/fred/mywork.java /tmp/testme.java 

위의 두 파일에 대해 emacs를 실행하려는 시도에서는 분명히 실패할 것입니다. 따라서 당신이 할 수 있는 일은 다음과 같이 입력하는 것입니다:

emacs !* 

그러면 명령줄에 마지막으로 입력한 인수로 emacs가 실행됩니다. 즉, 이는 다음을 입력하는 것과 동일합니다.

emacs /home/fred/mywork.java /tmp/testme.java

~명령줄 기록

관련 정보