Computer >> 컴퓨터 >  >> 프로그램 작성 >> BASH 프로그래밍

알아야 할 Linux Bash 기록 확장 예제 15개

알아야 할 Linux Bash 기록 확장 예제 15개Bash 히스토리는 매우 강력합니다. bash 기록 확장을 효과적으로 사용하는 방법을 이해하면 Linux 명령줄에서 매우 생산적으로 작업할 수 있습니다.

이 기사에서는 다음 bash 기록 확장 기능을 사용하는 15가지 예를 설명합니다.

  • 이벤트 지정자 – 기록의 특정 명령을 나타냅니다. !
  • 로 시작합니다.
  • 단어 지정자 – 기록 항목의 특정 단어를 나타냅니다. 일반적으로 이것은 짝수 지정자와 결합됩니다. 지정자와 단어 지정자도 콜론으로 구분됩니다.
  • 수정자 – 이벤트 또는 단어 지정자가 수행한 대체 결과 수정

이 기사는 진행 중인 Bash 튜토리얼 시리즈의 일부입니다.

이미 알고 있듯이 모든 기록 항목을 보려면 history 명령을 사용하십시오. 그러면 이전에 실행된 모든 명령이 기록 테이블의 해당 명령에 대한 번호와 함께 표시됩니다.

$ history
1 tar cvf etc.tar /etc/
2 cp /etc/passwd /backup
3 ps -ef | grep http
4 service sshd restart
5 /usr/local/apache2/bin/apachectl restart

Bash 히스토리 이벤트 지정자

1. !n

을 사용하여 기록에서 특정 명령을 실행합니다.

이전에 명령어를 실행했다면 다시 입력하지 않고 히스토리에 있는 해당 명령어 번호를 이용하여 빠르게 실행할 수 있습니다.

예를 들어 명령 #4를 실행하려면 다음을 수행하십시오. 이렇게 하면 기록에서 명령 #4가 표시되고 즉시 실행됩니다.

<센터>
$ !4
service sshd restart

2 명령을 다시 입력한 명령을 실행하려면 다음을 수행하십시오.

$ !-2

이전 명령을 실행하려면 다음 중 하나를 수행하십시오.

$ !!

$ !-1

-P(기본 emacs 모드에 있는 경우)를 눌러 이전 명령으로 이동할 수도 있습니다.

'set -o vi'를 사용하여 명령줄에 대해 vi 스타일 편집을 활성화한 경우 -k를 사용하여 이전 명령으로 이동합니다.

2. !string 및 !?string

을 사용하여 키워드로 명령 실행

키워드를 사용하여 기록에서 명령을 실행할 수도 있습니다.

다음 예는 키워드로 시작하는 이전 명령을 검색합니다. "ps"를 입력하고 실행합니다. 이 예에서는 이전 명령인 "ps -ef | grep http”를 입력하고 실행합니다.

$ !ps
ps -ef | grep http

다음 예는 키워드를 포함하는 이전 명령을 검색합니다. "아파치"하고 실행하십시오. 이 예에서는 이전 명령인 "/usr/local/apache2/bin/apachectl restart"를 선택하여 실행합니다.

$ !?apache
/usr/local/apache2/bin/apachectl restart

3. ^str1^str2^

를 사용하여 이전 명령의 문자열 바꾸기

다음 예에서는 먼저 ls 명령을 실행하여 파일을 확인했습니다. 나중에 우리는 파일의 내용을 보고 싶다는 것을 깨달았습니다. 전체 파일 이름을 다시 입력하는 대신 아래와 같이 이전 명령의 "ls"를 "cat"으로 바꿀 수 있습니다.

$ ls /etc/cron.daily/logrotate

$ ^ls^cat^
cat /etc/cron.daily/logrotate

참고:추가 bash 기록 팁은 Linux 명령줄 기록을 마스터하는 15가지 예를 참조하세요. 히스토리에 타임스탬프를 표시하는 방법과 HISTTIMEFORMAT, HISTSIZE, HISTFILE, HISTCONTROL, HISTIGNORE 등 다양한 히스토리 관련 환경 변수를 사용하는 방법을 설명합니다.

Bash 역사 단어 지정자

단어 지정자는 새 명령을 입력하려고 할 때 매우 유용하지만 이전에 실행된 명령 중 하나의 인수를 사용합니다. 몇 가지 예가 아래에 나와 있습니다.

4. :^

를 사용하여 명령의 첫 번째 인수를 가져옵니다.

다음 예에서 "!cp:^"는 "ls -l" 명령에 대한 인수로 주어졌습니다. "!cp:^"는 "cp"로 시작하는 기록에서 이전 명령을 찾고 해당 명령의 첫 번째 인수를 가져옵니다.

$ cp /etc/passwd /backup

$ ls -l !cp:^
ls -l /etc/passwd

다음 예는 이전 명령에서 첫 번째 인수를 가져옵니다.

$ ls -l !!:^

5. :$

를 사용하여 명령의 마지막 인수를 가져옵니다.

다음 예에서 "!cp:$"는 "ls -l" 명령에 대한 인수로 주어졌습니다. "!cp:$"는 "cp"로 시작하는 기록에서 이전 명령을 찾고 해당 명령의 마지막 인수를 가져옵니다.

$ cp /etc/passwd /backup

$ ls -l !cp:$
ls -l /backup

다음 예는 이전 명령에서 마지막 인수를 가져옵니다.

$ls -l !!:$

6. :n

을 사용하여 명령의 n번째 인수를 가져옵니다.

다음 예에서 "!tar:2"는 "ls -l" 명령에 대한 인수로 주어졌습니다. "!tar:2"는 "tar"로 시작하는 기록에서 이전 명령을 찾고 해당 명령의 두 번째 인수를 가져옵니다.

$ tar cvfz /backup/home-dir-backup.tar.gz /home

$ ls -l !tar:2
ls -l /backup/home-dir-backup.tar.gz

7. :*

를 사용하여 명령에서 모든 인수를 가져옵니다.

다음 예에서 "!cp:*"는 "ls -l" 명령에 대한 인수로 제공되었습니다. "!cp:*"는 기록에서 "cp"로 시작하는 이전 명령을 찾고 모든 인수를 가져옵니다.

$ cp /etc/passwd /backup

$ ls -l !cp:*
ls -l /etc/passwd /backup

8. !%

를 사용하여 최근에 검색한 단어를 참조하십시오.

위에서 설명한 것처럼 "!?apache"는 "apache"라는 키워드가 포함된 이전 history 명령을 검색하여 실행합니다.

$ /usr/local/apache2/bin/apachectl restart

$ !?apache
/usr/local/apache2/bin/apachectl restart

!%는 이전 "?"와 일치하는 전체 단어를 나타냅니다. 검색.

예를 들어 이전에 "?apache"를 검색한 경우 "!%"는 전체 단어 "/usr/local/apache2/bin/apachectl"과 일치합니다. 이 문맥에서 "/"는 한 단어의 일부로 취급됩니다.

따라서 이 경우 다음을 실행하면 아파치를 중지할 수 있습니다.

$ !% stop
/usr/local/apache2/bin/apachectl stop

9. x-y를 사용하여 명령에서 인수 범위 가져오기

다음 예에서는 "ls -l" 명령의 인수로 "!tar:3-5"가 주어졌습니다. "!tar:3-5"는 "tar"로 시작하는 기록에서 이전 명령을 찾고 3에서 5까지의 인수를 가져옵니다.

$ tar cvf home-dir.tar john jason ramesh rita

$ ls -l !tar:3-5
ls -l john jason ramesh

다음은 2에서 모든 인수를 가져옵니다.

$ ls -l !tar:2-$

다음 사항에 유의하십시오.

  • !!:* 이전 명령의 모든 인수를 가져옵니다.
  • !!:2* 두 번째 인수부터 모든 인수를 가져옵니다.
  • !!:2-$ 위와 동일합니다. 두 번째 인수부터 모든 인수를 가져옵니다.
  • !!:2- 두 번째 인수에서 시작하는 모든 인수를 가져옵니다(마지막 인수 제외).

Bash 기록 수정자

수정자는 아래 예에 설명된 대로 단어 지정자 뒤에 주어집니다.

10. :h

를 사용하여 단어에서 후행 경로 이름을 제거합니다.

다음 예에서 "!!:$:h"는 이전 명령의 마지막 인수를 취하고 후행 경로 이름을 제거합니다. 이 경우 파일 이름을 제거하고 전체 경로만 가져옵니다.

$ ls -l /very/long/path/name/file-name.txt

$ ls -l !!:$:h
ls -l /very/long/path/name

11. :t

를 사용하여 단어에서 모든 선행 경로 이름을 제거합니다.

이것은 앞의 예와 정반대입니다.

다음 예에서 "!!:$:t"는 이전 명령의 마지막 인수를 취하고 모든 선행 경로 이름을 제거합니다. 이 경우 파일명만 받습니다.

$ ls -l /very/long/path/name/file-name.txt

$ ls -l !!:$:t
ls -l file-name.txt

12. :r

을 사용하여 단어에서 파일 이름 확장명 제거

다음 예에서 "!!:$:r"은 이전 명령의 마지막 인수를 취하고 ".suffix"(여기서는 파일 이름 확장명)만 제거합니다. 이 경우 .txt를 제거했습니다.

$ ls -l /very/long/path/name/file-name.txt

$ ls -l !!:$:r
ls -l /very/long/path/name/file-name

13. :s/str1/str2/

를 사용하여 bash 기록에서 Sed와 같은 대체

앞에서 논의한 것처럼 "^original^replacement^"를 사용하는 대신 아래 예제와 같이 bash 기록에서 sed와 같은 대체를 사용할 수도 있습니다. 이것은 기억하기 쉬울 수 있습니다. !! 이전 명령을 호출하는 것입니다. ":s/original-string/replacement-string/"은 문자열을 대체하는 sed와 같은 구문입니다.

$ !!:s/ls -l/cat/

g 플래그(s 플래그와 함께)를 사용하여 아래와 같이 전역 대체를 수행할 수도 있습니다. 여러 단어를 잘못 입력하여 모두 함께 변경하고 명령을 다시 실행하려는 경우에 유용합니다.

다음 예에서는 실수로 "passwd" 대신에 "password"를 두 번 입력했습니다.

$ cp /etc/password /backup/password.bak

이 문제를 해결하려면 다음과 같은 전역 기록 sed를 대체처럼 수행합니다.

$ !!:gs/password/passwd/
cp /etc/passwd /backup/passwd.bak

14. :&를 사용하여 빠르게 대체를 반복합니다.

위와 같이 이미 bash 히스토리 대체를 성공적으로 실행했다면 :&를 사용하여 동일한 대체를 빠르게 다시 반복할 수 있습니다.

다른 명령에 "passwd" 대신 "password"를 실수로 다시 입력했습니다.

$ tar cvf password.tar /etc/password

이제 명령을 다시 입력하거나 "gs/password/passwd"를 수행하는 대신 마지막 대체를 재사용하는 ":&"를 사용할 수 있습니다. 마지막 대체를 전역적으로 재사용하려면 ":g&"를 사용하십시오.

$ !!:g&
tar cvf passwd.tar /etc/passwd

15. :p

를 사용하여 명령을 실행하지 않고 인쇄하십시오.

이것은 복잡한 히스토리 대체를 수행하고 실행하기 전에 최종 명령을 보고 싶을 때 매우 유용합니다.

다음 예에서 "!tar:3-:p"는 실제로 명령을 실행하지 않습니다.

여기에 ":p"를 지정했기 때문에 대체를 수행하고 새 명령을 표시합니다. bash 히스토리 확장을 확인하고 이것이 실행하려는 명령이라고 생각되면 ":p"를 제거하고 다시 실행하십시오.

$ tar cvf home-dir.tar john jason ramesh rita

$ tar cvfz new-file.tar !tar:3-:p
tar cvfz new-file.tar john jason ramesh