bash에서 느낌표 (!) 이해


108

나는 사용했다

history | less

이전 명령의 줄과 왼쪽의 숫자를 얻으려면 반복하려는 줄을 찾았습니다 (예 : 22).

!22

명령 프롬프트에서 작동했습니다. 당시 내가 한 줄에서 명령 세트를 실행했습니다. 느낌표가 사용되는 위치, bash가 취한 조치 및 사용 위치의 관점에서 무엇을 나타내는 지 알 수 없습니다. 문서에서 '유형'인 설명이 보이지 않습니다.


6
이 답변 은 도움 될 것입니다.
Michael Mrozek

9
질문에 대한 답변은 아니지만 <ctrl> + R을 사용하면 대화식으로 기록을 검색 한 다음 원하는 내용을 찾으면 즉시 실행할 수 있습니다.
kasterma

답변:


144

!C 쉘 에 처음 등장한 기능으로 , 화살표 키를 사용하기 위해 터미널을 계산할 수있는 시절로 거슬러 올라갑니다. 현재 명령 번호를 프롬프트 ( PS1="\!$ ")에 추가하면 화면을 빠르게보고 과거 명령의 번호를 얻을 수 있는 경우 특히 유용 합니다.

이제 화살표 키와 Ctrl-R명령 기록 검색 과 같은 기능을 사용할 수 있으므로이 기능을 많이 사용하지는 않습니다.

여전히 유용하다고 생각되는 변형은 !!이전 명령을 다시 실행하는입니다. 그 자체로 !!Enter는 그저 더 빠르지 Enter않지만 더 큰 명령으로 결합하면 도움이 될 수 있습니다.

예 : 기반 시스템 에서 일반적인 파일럿 오류 는 추가 권한이 필요한 명령 sudo에서 sudo접두사 를 잊어 버리는 것 입니다. 초보자는 전체 명령을 다시 입력합니다. 부지런한 학생은 셸의 명령 기록에서 명령을 편집합니다. 깨달은 하나의 유형 sudo !!.

Bash를 사용하면 또는로 !쉘에서 처리 를 비활성화 할 수 있습니다 . 를 사용하여 Zsh에서 비활성화 할 수 있습니다 .set +o histexpandset +Hset -K


4
Ctrl-P Ctrl-J는 매우 빠릅니다. 적어도 Up Enter보다 빠릅니다.
ephemient

24
마지막 명령을 실행하려는 경우 Up / Enter는 괜찮지 만 어떤 식 으로든 추가하려는 경우 (예 : sudo, 또는 잊어 버린 것) sudo !!예를 들어 할 수 있습니다 . "Up / Ctrl-A (또는 운이 좋으면 집) / sudo / space / enter"보다 약간 빠를 수 있습니다. YMMV. :)

1
@AquariusPower : 그냥 인용하십시오. 하나 echo 'Hi!'또는 echo "Hi!"echo Hi\!. 모두 같은 일을합니다.
워렌 영

1
setopt NO_BANG_HISTzsh에서는보다 기억에 남을 수 있습니다 -K.
그레고리

48

더 이상 대답이 없으면 최근에 한 사람을 읽었 기 때문에 슈퍼 유저에 대한 답변이 있습니다. 에서 bash는 남자 페이지 당신은 큰 섹션 제목 찾을 수 있습니다 역사 확장 문제에 있습니다.

마지막 명령 또는 명령 번호 X를 실행하는 것보다 전체 호스트를 수행 할 수 있습니다 .로 !cat시작한 마지막 명령을 실행하는 것과 같은 작업 을 수행 할 수 있습니다 cat. 또는 !?bash?:s/bash/csh/포함 된 마지막 명령을 실행 bash하지만로 대체합니다 csh.


3
OP의 질문에 직접 대답하지는 않지만 더 많은 투표가 필요합니다. 매우 유용합니다! 고마워요
malvim

인터넷 검색을 시작하기 전에 맨 페이지를 살펴 봐야합니다.
erikbwork

1
!!:s/bash/csh/실제로 마지막 명령을 실행 한 다음 bash를 csh (있는 경우)로 바꿉니다. bash가 포함 된 마지막 명령이 아닙니다. 즉 것 !?bash?:s/bash/csh/어쩌면 나!?bash?:s/%/csh/
CDE

몇 년 동안 Bash를 광범위하게 사용한 결과, 이전에는이 ​​키워드에 대해 전혀 알지 못했고 man페이지를 훑어 보는 데 몇 시간을 보냈지 만이 기능은 매우 모호합니다. 관련 섹션을 지적 해 주셔서 감사합니다. 실제 문서에서 충분히 설명 할 수있는 유일한 곳입니다.
Steve Benner

39

다음 !과 같이 훨씬 더 많은 작업을 수행 할 수 있습니다 .

  • 3 개의 명령 앞에 입력 된 명령을 실행하십시오. !-3
  • 로 시작하는 명령을 실행 !ls

그리고 훨씬 더. 알아야 할 15 Linux Bash 히스토리 확장 예제 참조


이것을 찬성했습니다. 다른 답변들 중 어느 것도 이러한 영리한 트릭을 가지고 있지 않았습니다.
Gergely Lukacsy

www.thegeekstuff.com이 단순히 환상적인 리소스이기 때문에 공감되었습니다. 이것은 이전에 보지 못했던 몇 가지 Linux 기사 중 하나였습니다. 매우 도움이됩니다.
Steve Benner

4

내 친구가 저에게 이메일을 보냈습니다.

GNU 히스토리 라이브러리의 일부입니다. bash에서는 히스토리에서 명령을 다시 실행하는 데 사용됩니다. 하드 코어가 되려면 bash-4.1 / lib / readline / histexpand.c에서 history_expansion_char를 grep하여 구현 세부 사항을 확인하십시오.


3

물론 !!bash 쉘에서 마지막 명령을 재사용 할 수 있습니다 . 그리고 !$마지막 명령의 마지막 부분을 재사용해야합니다.

예를 들어 일부 파일보기

less path/to/your/file.txt

동일한 파일을 편집 !$하려면 마지막 명령에서 파일 경로 만 가져 오십시오.

vim !$

1
아, 나는 이것을 찾기를 바랐다. 두 개의 인수로 어떻게 작동합니까?
조나단

두 가지의 마지막 주장을 재사용 할 것입니다. $touch f1 f2그런 다음$vim !$$vim f2
Teshan Shanuka J
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.