루트로 동일한 명령을 다시 실행하십시오.


117

때로는 명령을 실행할 때 충분한 권한을 얻기 위해 수퍼 유저로 명령을 실행해야한다는 것을 알지 못합니다.

동일한 명령을 다시 실행하지만 슈퍼 유저로 실행할 수있는 방법이 있습니까?

답변:


196

가장 간단한 방법은 다음을 실행하는 것입니다.

sudo !!

마지막 명령이 실행되지만 수퍼 유저로 실행됩니다.

소스 .


5
나는 이것이 매우 유용하다는 것을 알았고 전에는 그것을 보지 못했다. 나는 사이트에서 그것을 찾을 수 없어서 내가 스스로 대답 할 것이라고 생각했다.
Trufa

30
따로, !!자체 실행은에 저장된대로 이전 명령을 실행합니다 history. 또한, 일 !-1, !-2등등 등등 마지막 명령, 두 번째 마지막 명령 등을 실행합니다. 능숙한!
oaskamay

6
또 다른 옆으로, 시작 !<command>부터 마지막 ​​이벤트를 실행합니다~/.bash_history<command>
Radu Rădeanu

1
ctrl-r도 매우 유용합니다. 입력 한 내용과 일치하는 명령을 찾기 위해 내역에서 뒤로 검색합니다. 이렇게하면 명령을 다시 실행하기 전에 편집 할 수 있습니다.
KayEss

4
이 어리석은 !bash tcsh는 복사 된 것 보다 유용했습니다. 큰 따옴표는의 해석에서 보호되지 않습니다 !. $ foo "!bar"-> !bar: event not found.
Kaz

70

​​​​​​​​​​​​​​​​​​​​​​​​​​​​​여기에 이미지 설명을 입력하십시오

대답 :sudo !! 이후 에스컬레이션 된 권한으로 이전 명령을 반복하려면 바로 입력하십시오 .

편집 : reddit을 통해 발견 된 이미지 이며 Randall Munroe 의 원래 xkcd 만화 의 패러디입니다 .


3
의견이 있으시면 대화를 나누지 마십시오. 장점이나 다른 점을 논의하려면 메타를 사용하십시오. 감사.
fossfreedom

17

위쪽 화살표 키를 사용하여 이전 명령을 스크롤하고 다시 작성 / 변경하고 sudo앞에 명령을 추가 할 수 있습니다. (화살표 키 위의 홈 버튼은 위치를 시작으로 설정합니다.)

sudo !!때로는 그 사이에 다른 명령을 추가하고 더 이상 기억하지 않기 때문에 아이디어가 마음에 들지 않습니다.


1
다행히도을 수행 sudo !!하면 쉘이 확장 !!되어 실행하려는 명령을 볼 수 있습니다. 따라서 Ctrl-C를 누르고 올바른 명령을 찾는 것이 자극적 일 수 있지만 적어도 알지 못합니다.
리드

4
@Reid이 될 때까지 확장되지 않습니다 후에 는 Enter 키를 누르십시오, 당신은 당신이 암호를 다시 입력 할 필요가 없습니다 윈도우 내에 있다면, 그것은 확인없이 실행됩니다. 맹목적으로 사용하는 대신 역사를 사용하는 +1!!
Izkata

5
@Izkata : 나는 그것이 사실이라고 생각합니다. 나는 zsh를 사용하므로 그냥 입력 sudo !!<TAB>하면 자동 완성 !!됩니다. Bash는 M-^(alt + shift + 6)으로 역사를 확장 할 수 있지만 유창하지는 않습니다 (이를 리 바인드 할 수는 있습니다). 또한 shopt -s histverify히스토리 확장을 사용하고 Enter 키를 누를 때 확장을 보거나 편집 할 수 있도록 확장 된 프롬프트 라인을 제공합니다.
리드

1
나는 명령을 입력 한 상황에 대해 더 많이 생각하고 있었고, 명령은 권한이 거부되었다는 것을 반환했으며,이 동일한 명령을 다시 실행하고 싶지만 sudo, 누르는 과정, 집, sudo 입력 및 많은 느낌 나에게 느려. 그것은 내가 영원히 해왔 던 방식이며 비효율적이라고 느꼈습니다.
Trufa

@ 리드 : shopt -s histverify단일 비트를 도울 수 없습니다. 대부분의 사람들은 Enter두 번 때리는 데 익숙해 질 것 입니다. 그 시점에서 그들은 무슨 일이 있었는지 확인하기에는 아직 늦었습니다.
Frank Kusters

13

나는 대안을 추가 할 것입니다 : 타이핑 만큼 짧고sudo !! 유연합니다.

Up-arrow (once, or until you find the command you want to sudo/edit, if it's older)
ctrl+A   (place cursor at beginning of line)
"sudo "
Enter

정확히 같은 수의 키 스트로크 ( "ctrl + A"를 하나로 계산하지만 ...) "위쪽 화살표"를 추가하면 히스토리에있는 명령에 관계없이 수행 할 수 있습니다.


1
ctrl + A는 emacs 바인딩에서 가져온 것으로 vi 바인딩 ( set -o vi)을 사용할 수도 있습니다 . 그런 다음 이스케이프 (명령 모드로 이동) 한 다음 'I'(자본 'i', 줄 시작 부분에 삽입) 할 수 있습니다.
Gerhard Burger

1
@GerhardBurger : 알아요,하지만, 이상하게, 내가 좋아하는 여러 줄의 문서를 편집 VI를 (특히 정력),하지만 난 많은 쉘에 바인딩 이맥스를 선호 할 (쉘하지 않는 모드에서 편집 명령으로 전환 할 필요 실제로 의미가 있고, imo이며, emacs의 지름길은 덜 강력하더라도 일상적으로 사용하기에 충분합니다.)
Olivier Dulac

사실, 나는 완전성을 위해 그것을 추가했지만, 나에게는 동일하지만 '/'로 검색하는 것이 매우 편리합니다.)
Gerhard Burger

@GerhardBurger : vi 모드의 "/", 일반 (emacs 바인딩) bash는 몇 개의 문자를 입력 한 다음 'ctrl + r'을 입력하여 찾을 때까지 이전 명령을 찾는 매우 편리한 방법입니다.
Olivier Dulac

7

이 작업을 수행하는 몇 가지 방법이 있습니다

  • 명령 sudo전에 명령을 다시 추가 하기 만하면됩니다.

  • 을 눌러 Up arrow마지막 명령을 가져 와서 sudo앞에 놓습니다.

  • 들어가다 sudo !!

!!마지막으로 확장 명령을 입력했습니다. 커맨드 라인 히스토리로 다른 것들과 비슷한 일을 할 수 있습니다. 여기를 참조 하십시오


7

유닉스에서 훌륭한 디자인 결정 중 하나는 쉘에서 한 번 구현 된 것이 쉘에서 호출 된 명령에 의해 활용 될 수 있기 때문에이 질문은 " 동일한 명령을 실행하지만 약간의 수정만으로 " 일반화 될 수 있습니다.

즉,이 트릭은 적용되지 않습니다 합니다 sudo:

  • 이전 명령을 수퍼 유저 ( sudo !!) 로 반복
  • 이전 명령을 반복하고 시간을 정합니다 ( time !!)
  • 다른 환경에서 이전 명령을 반복하십시오 ( env A=b B=z !!)
  • 이전 명령을 반복하십시오 ( !!)

히스토리 확장 (히스토리 대체라고도 함)은 이전 명령을보다 쉽게 ​​반복 할 수 있도록하는 키 기능입니다 (키 입력을 줄임). 쉘 매뉴얼 페이지를 확인하십시오 history expansion. 예를 들어 기록으로 할 수있는 더 많은 트릭과 바로 가기를 설명합니다.

번호로 이전 명령을 참조 할 수 있습니다.

!55                 # repeat command number 55
!-1                 # repeat the previous command, alias for !!
!-2                 # repeat the command before the previous command

이전 명령에서 개별 단어를 참조 할 수 있습니다.

some-command !$     # run some-command on the last arg of previous command

반복하기 전에 검색 할 수도 있습니다.

!?awk               # repeat the last command including the string 'awk'

기록을 검색하고 다른 것으로 대체 할 수 있습니다.

!?awk?:s/str1/str2/  # repeat previous command matching 'awk' replacing str1 by str2

또한 명령 선택, arg-selection, search 및 replace를 독립적으로 결합 할 수 있으므로 훨씬 더 좋습니다.

쉘의 맨 페이지 (이 경우 man bash)는 친구입니다.


1
화려 함! 그 중 하나가 받아 들여 져야합니다.
Eliran Malka

5

나는 bash 대신 zsh 를 사용 하고 이것을 내 안에 가지고 ~/.zshrc있으므로 명령 줄의 시작 부분에 Alt+ S삽입 sudo을 누르면 :

insert_sudo () { zle beginning-of-line; zle -U "sudo " }
zle -N insert-sudo insert_sudo
bindkey "^[s" insert-sudo

불행히도, 나는 bash에서 같은 일을하는 방법을 추적 할 수 없었다.


3
당신은 쉽게 GNU Readline와 사용 배쉬에서 같은 작업을 수행 할 수 있습니다 귀하의 추가 ~/.inputrc "\es":"\C-asudo "당신은 긴 줄의 시작 부분으로 이동 하고 눌러시 라인의 시작 부분에 삽입됩니다 sudo는 alt-s. 터미널을 다시 시작하거나 다시 읽으십시오 ~/.inputrc.

2

별명으로 작성하려면 alias redo='sudo $(history -p !!)'어떤 이유로 사용해야 합니다.


1
su -c "!!"

sudo 또는 sudo 프로그램으로 루트 권한을 가지고 있지 않은 경우 시스템에 설치되지 않았습니다.


1

내가 선호하는 방식 :

  • 화살표 키
  • "스도"
  • 들어가다

그러나 "sudo !!"를하는 것이 더 쉬울 수도 있습니다. 그것은 당신에게 달려 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.