Linux에서 history 명령을 사용하는 방법

Linux의 셸은 실행한 명령의 기록을 저장하고 검색하여 과거에 실행한 명령을 반복할 수 있습니다. Linux history 명령과 사용법을 이해하면 생산성을 크게 높일 수 있습니다.

기록 조작

처럼 조지 산타야나는 유명한 말을 했습니다., “과거를 기억하지 못하는 자는 과거를 되풀이할 수밖에 없다.” 불행히도 Linux에서는 과거를 기억할 수 없으면 반복하고 싶어도 반복할 수 없습니다.

그럴 때 Linux history 명령이 유용합니다. 이전 명령을 검토하고 반복할 수 있습니다. 이것은 단순히 게으름을 부추기거나 시간을 절약하기 위한 것이 아닙니다. 효율성(및 정확성) 요소도 작용합니다. 명령이 길고 복잡할수록 기억하고 오류 없이 입력하기가 더 어렵습니다. 오류에는 두 가지 유형이 있습니다. 하나는 명령이 작동하지 않도록 하는 것이고 다른 하나는 명령이 작동하도록 허용하지만 예상치 못한 일을 하게 만듭니다.

history 명령은 이러한 문제를 제거합니다. 대부분의 Linux 명령과 마찬가지로 당신이 생각하는 것보다 더 많은 것이 있습니다. 그러나 history 명령을 사용하는 방법을 배우면 매일 Linux 명령줄 사용을 향상시킬 수 있습니다. 시간을 투자하는 것이 좋습니다. 단순히 위쪽 화살표를 반복적으로 누르는 것보다 history 명령을 사용하는 훨씬 더 좋은 방법이 있습니다.

역사 명령

가장 간단한 형태로 이름을 입력하여 history 명령을 사용할 수 있습니다.

history

그만큼

그런 다음 이전에 사용한 명령 목록이 터미널 창에 기록됩니다.

의 출력 예

명령에는 번호가 매겨져 있으며 가장 최근에 사용한 것(가장 높은 번호가 있는 것)이 목록 끝에 표시됩니다.

특정 수의 명령을 보려면 명령줄의 기록에 숫자를 전달할 수 있습니다. 예를 들어, 마지막으로 사용한 10개의 명령을 보려면 다음을 입력하십시오.

history 10

그만큼

파이프 히스토리를 통해 동일한 결과를 얻을 수 있습니다. 꼬리 명령. 이렇게 하려면 다음을 입력합니다.

history | tail -n 10

그만큼

반복 명령

히스토리 목록에서 명령을 재사용하려면 느낌표(!)와 명령 번호를 공백 없이 입력하세요.

예를 들어, 명령 번호 37을 반복하려면 다음 명령을 입력합니다.

!37

안

마지막 명령을 반복하려면 공백 없이 느낌표 두 개를 다시 입력합니다.

!!

안

이것은 명령을 실행하고 sudo 사용을 잊었을 때 유용할 수 있습니다. sudo, 공백 하나, 느낌표 두 개를 입력하고 Enter 키를 누릅니다.

다음 예에서는 sudo가 필요한 명령을 입력했습니다. 전체 줄을 다시 입력하는 대신 아래와 같이 여러 키 입력을 저장하고 sudo !!를 입력하면 됩니다.

mv ./my_script.sh /usr/local/bin/
sudo !!

안

따라서 목록에서 해당 번호를 입력하여 명령을 반복하거나 이중 느낌표를 사용하여 마지막으로 사용한 명령을 반복할 수 있습니다. 그러나 다섯 번째 또는 여덟 번째 명령을 반복하려면 어떻게 해야 합니까?

  Outlook에서 규칙을 사용하여 이메일을 자동으로 숨은 참조 이메일로 보내는 방법

하나의 느낌표, 하이픈(-) 및 이전 명령의 번호(공백 없이)를 사용하여 반복할 수 있습니다.

13번째 이전 명령을 반복하려면 다음을 입력합니다.

!-13

안

문자열로 명령 검색하기

특정 문자열로 시작하는 마지막 명령을 반복하려면 느낌표를 입력한 다음 공백 없이 문자열을 입력하고 Enter 키를 누릅니다.

예를 들어 sudo로 시작된 마지막 명령을 반복하려면 다음 명령을 입력합니다.

!sudo

안

하지만 여기에는 위험 요소가 있습니다. sudo로 시작된 마지막 명령이 생각했던 것과 다른 경우 잘못된 명령을 실행하게 됩니다.

그러나 안전망을 제공하기 위해 아래와 같이 :p(인쇄) 수정자를 사용할 수 있습니다.

!sudo:p

안

이것은 명령을 실행하는 대신 터미널 창에 명령을 인쇄하도록 히스토리에 지시합니다. 이렇게 하면 명령을 사용하기 전에 볼 수 있습니다. 원하는 명령이면 위쪽 화살표를 누른 다음 Enter 키를 눌러 사용합니다.

특정 문자열이 포함된 명령을 찾으려면 느낌표와 물음표를 사용할 수 있습니다.

예를 들어 “aliases”라는 단어가 포함된 첫 번째 일치 명령을 찾아 실행하려면 다음 명령을 입력합니다.

!?aliases

안

이렇게 하면 문자열에 나타나는 위치에 관계없이 “aliases” 문자열이 포함된 모든 명령을 찾습니다.

대화형 검색

대화식 검색을 통해 일치하는 명령 목록을 건너뛰고 원하는 명령을 반복할 수 있습니다.

Ctrl+r을 눌러 검색을 시작하십시오.

이후 터미널 창

검색 단서를 입력하면 일치하는 첫 번째 명령이 나타납니다. 입력하는 문자는 백틱(`)과 아포스트로피(‘) 사이에 나타납니다. 각 문자를 입력할 때 일치하는 명령이 업데이트됩니다.

ㅏ

Ctrl+r을 누를 때마다 터미널 창에 나타나는 일치하는 다음 명령을 역방향으로 검색하게 됩니다.

ㅏ

Enter 키를 누르면 표시된 명령이 실행됩니다.

그만큼

명령을 실행하기 전에 편집하려면 왼쪽 또는 오른쪽 화살표 키를 누르십시오.

ㅏ

명령이 명령줄에 나타나며 편집할 수 있습니다.

다른 Linux 도구를 사용하여 기록 목록을 검색할 수 있습니다. 예를 들어, history의 출력을 grep으로 파이프하고 문자열을 포함하는 명령 검색 “별칭”은 다음 명령을 사용할 수 있습니다.

history | grep aliases

그만큼

마지막 명령 수정

오타를 수정한 다음 명령을 반복해야 하는 경우 캐럿(^)을 사용하여 수정할 수 있습니다. 이것은 명령의 철자가 틀리거나 다른 명령줄 옵션이나 매개변수를 사용하여 명령을 다시 실행하려는 경우에 대비할 수 있는 훌륭한 트릭입니다.

그것을 사용하려면 (공백 없이) 캐럿, 바꿀 텍스트, 다른 캐럿, 바꿀 텍스트, 다른 캐럿을 입력하고 Enter 키를 누릅니다.

예를 들어 다음 명령을 입력했는데 실수로 “sshd” 대신 “shhd”를 입력했다고 가정합니다.

sudo systemctl start shhd

다음을 입력하여 이 문제를 쉽게 수정할 수 있습니다.

^shhd^sshd^

ㅏ

명령은 “sshd”를 “sshd”로 수정하여 실행됩니다.

기록 목록에서 명령 삭제

-d(삭제) 옵션을 사용하여 기록 목록에서 명령을 삭제할 수도 있습니다. 맞춤법이 틀린 명령을 기록 목록에 보관할 이유가 없습니다.

grep을 사용하여 찾고, -d 옵션을 사용하여 해당 번호를 기록에 전달하여 삭제한 다음, 다시 검색하여 삭제되었는지 확인할 수 있습니다.

history | grep shhd
history -d 83
history | grep shhd

그만큼

-d 옵션에 다양한 명령을 전달할 수도 있습니다. 22에서 32(포함)까지의 모든 목록 항목을 삭제하려면 다음 명령을 입력하십시오.

history -d 22 32

마지막 5개 명령만 삭제하려면 다음과 같이 음수를 입력할 수 있습니다.

history -d -5

히스토리 파일 수동 업데이트

로그인하거나 터미널 세션을 열 때 히스토리 파일에서 히스토리 목록을 읽습니다. Bash에서 기본 히스토리 파일은 .bash_history입니다.

  2019년 iOS용 최고의 메모 작성 앱 8가지

현재 터미널 창 세션에서 변경한 사항은 터미널 창을 닫거나 로그아웃할 때만 기록 파일에 기록됩니다.

첫 번째 터미널 창에 입력한 명령을 포함하여 전체 기록 목록에 액세스하기 위해 다른 터미널 창을 열고 싶다고 가정합니다. -a(all) 옵션을 사용하면 두 번째 터미널 창을 열기 전에 첫 번째 터미널 창에서 이 작업을 수행할 수 있습니다.

사용하려면 다음을 입력하십시오.

history -a

그만큼

명령은 기록 파일에 자동으로 기록됩니다.

히스토리 목록에 대한 모든 변경 사항을 히스토리 파일에 기록하려면(예를 들어 일부 이전 명령을 삭제한 경우) 다음과 같이 -w(쓰기) 옵션을 사용할 수 있습니다.

history -w

그만큼

기록 목록 지우기

기록 목록에서 모든 명령을 지우려면 다음과 같이 -c(지우기) 옵션을 사용할 수 있습니다.

history -c

히스토리 파일에 이러한 변경 사항을 추가로 적용하려면 다음과 같이 -w 옵션을 사용하십시오.

history -w

보안 및 기록 파일

명령줄에 중요한 정보(예: 암호)를 입력해야 하는 응용 프로그램을 사용하는 경우 이 정보도 기록 파일에 저장된다는 점을 기억하십시오. 특정 정보를 저장하지 않으려면 다음 명령 구조를 사용하여 기록 목록에서 즉시 삭제할 수 있습니다.

special-app my-secret-password;history -d $(history 1)
history 5

ㅏ

이 구조는 세미콜론(;)으로 구분된 두 개의 명령을 포함합니다. 이것을 분해해보자:

special-app: 우리가 사용하고 있는 프로그램의 이름.
my-secret-password: 명령줄에서 애플리케이션에 제공해야 하는 비밀 암호입니다. 이것이 명령 1의 끝입니다.
history -d: 두 번째 명령에서 history의 -d(삭제) 옵션을 호출합니다. 삭제할 내용은 명령의 다음 부분에 있습니다.
$(history 1): 이것은 명령 대체를 사용합니다. $()에 포함된 명령 부분은 서브쉘에서 실행됩니다. 해당 실행 결과는 원래 명령에 텍스트로 게시됩니다. history 1 명령은 이전 명령을 반환합니다. 따라서 두 번째 명령을 history -d “여기에 마지막 명령”이라고 생각할 수 있습니다.

history 5 명령을 사용하여 암호가 포함된 명령이 기록 목록에서 제거되었는지 확인할 수 있습니다.

하지만 이보다 더 간단한 방법이 있습니다. Bash는 기본적으로 공백으로 시작하는 줄을 무시하기 때문에 다음과 같이 줄 시작 부분에 공백을 포함하기만 하면 됩니다.

 special-app another-password
history 5

ㅏ

암호가 있는 명령은 기록 목록에 추가되지 않습니다. 이 트릭이 작동하는 이유는 .bashrc 파일에 포함되어 있습니다.

.bashrc 파일

.bashrc 파일은 로그인하거나 터미널 창을 열 때마다 실행됩니다. 여기에는 history 명령의 동작을 제어하는 ​​몇 가지 값도 포함됩니다. 이 파일을 gedit로 편집해 봅시다.

  Linux에서 Arc 및 Arc Darker 테마를 설치하는 방법

다음을 입력합니다.

gedit .bashrc

그만큼

파일 상단 근처에 두 개의 항목이 표시됩니다.

HISTSIZE: 기록 목록이 포함할 수 있는 최대 항목 수입니다.
HISTFILESIZE: 히스토리 파일이 포함할 수 있는 라인 수에 대한 제한입니다.

이 두 값은 다음과 같은 방식으로 상호 작용합니다.

로그인하거나 터미널 창 세션을 시작하면 히스토리 목록이 .bash_history 파일에서 채워집니다.
터미널 창을 닫을 때 HISTSIZE에 설정된 최대 명령어 수는 .bash_history 파일에 저장된다.
histappend 셸 옵션이 활성화된 경우 명령이 .bash_history에 추가됩니다. histappend가 설정되지 않은 경우 .bash_history를 덮어씁니다.
히스토리 목록의 명령을 .bash_history 에 저장한 후 히스토리 파일은 HISTFILESIZE 라인 이하로 잘립니다.

또한 파일 상단 근처에 HISTCONTROL 값에 대한 항목이 표시됩니다.

그만큼

이 값을 설정하여 다음 중 하나를 수행할 수 있습니다.

ignorespaces: 공백으로 시작하는 줄은 기록 목록에 추가되지 않습니다.
ignoreups:중복 명령이 기록 파일에 추가되지 않습니다.
ignoreboth: 위의 두 가지를 모두 활성화합니다.

기록 목록에 추가하고 싶지 않은 특정 명령을 나열할 수도 있습니다. 콜론(:)으로 구분하고 따옴표(“…”)로 묶습니다.

이 구조를 따라 .bashrc 파일에 줄을 추가하고 무시하려는 명령으로 대체합니다.

export HISTIGNORE="ls:history"

안

타임스탬프 사용

기록 목록에 타임스탬프를 추가하려면 HISTIMEFORMAT 설정을 사용할 수 있습니다. 그렇게 하려면 .bashrc 파일에 다음과 같은 줄을 추가하기만 하면 됩니다.

export HISTTIMEFORMAT="%c "

닫는 따옴표 앞에 공백이 있습니다. 이렇게 하면 타임스탬프가 명령 목록의 명령과 일치하는 것을 방지할 수 있습니다.

안

이제 history 명령을 실행하면 날짜 및 타임스탬프가 표시됩니다. 타임스탬프를 추가하기 전에 기록 목록에 있던 모든 명령은 타임스탬프를 수신한 첫 번째 명령의 날짜와 시간으로 타임스탬프가 찍힙니다. 아래 표시된 이 예에서 이것은 명령 118이었습니다.

그것은 매우 긴 시간 소인입니다. 그러나 %c 이외의 토큰을 사용하여 구체화할 수 있습니다. 사용할 수 있는 다른 토큰은 다음과 같습니다.

%d: 일
%m: 월
%y: 연도
%H: 시간
%M: 분
%S: 초
%F: 전체 날짜(년-월-일 형식)
%T: 시간(시:분:초 형식)
%c: 완전한 날짜 및 시간 스탬프(일-일-월-년 및 시:분:초 형식)

몇 가지 다른 토큰을 실험하고 사용해 보겠습니다.

export HISTTIMEFORMAT="%d n%m %T "

내보내기 HISTTIMEFORMAT=

출력은 일, 월 및 시간을 사용합니다.

그러나 일과 월을 제거하면 시간만 표시됩니다.

HISTIMEFORMAT에 대한 모든 변경 사항은 전체 기록 목록에 적용됩니다. 이는 각 명령에 대한 시간이 다음과 같이 저장되기 때문에 가능합니다. Unix epoch로부터의 초 수. HISTTIMEFORMAT 지시문은 다음과 같이 초 수를 사람이 읽을 수 있는 스타일로 렌더링하는 데 사용되는 형식을 지정합니다.

export HISTTIMEFORMAT="%T "

그만큼

이제 출력을 더 쉽게 관리할 수 있습니다.

history 명령을 사용하여 감사할 수도 있습니다. 때때로 과거에 사용한 명령을 검토하면 문제를 일으킨 원인을 식별하는 데 도움이 될 수 있습니다.

인생에서 할 수 있는 것처럼 Linux에서 history 명령을 사용하여 좋은 시간을 다시 경험하고 나쁜 상황에서 배울 수 있습니다.