긴 명령어 편집

보통은 그냥 [[/cmd/fc]]를 사용하면 충분하다.

하지만 굳이 fc를 쓰지 않겠다면 다음을 고려해 보자.

  • set -o vi 모드에서 Esc v를 입력하면 vim이 열린다. 명령어 편집을 끝내고 저장/종료하면 명령어가 실행된다.
  • set -o emacs 모드에서는 <C-x><C-e>를 입력하면 emacs가 열린다.

emacs 모드를 사용하고 있지만 vim으로 편집하고 싶다면?

  • .bashrc에 EDITOR 변수를 vim으로 지정해준다.
export EDITOR=$(which vim)

입력중인 명령어를 주석처리

  • 명령어를 입력하다가
    • 입력하고 있던 명령어를 바로 실행하긴 곤란하고, 다 지우기도 애매한 경우가 있다.

<M-#>을 입력하면 입력하고 있던 명령어 제일 앞에 #이 추가되고, 새로운 명령어를 입력하는 프롬프트가 나온다.

  • Meta 키 입력을 어떻게 해야 할 지 모르겠다면 option + #, Alt + #, Esc #을 시도해보자.
  • 위의 방법이 다 안 된다면 <C-a>#을 입력하는 정도로 타협할 수 있겠다.

이전 명령 재실행

!!로 이전 명령을 재실행할 수 있다.

이전 명령의 arguments 재사용

다음과 같이 echo 명령을 실행했다고 하자.

$ echo a b c d
a b c d

이 때 아래와 같이 arg를 재참조할 수 있다.

form 설명 form 예제 expand 예제
!!:n 이전 명령의 n번째 arg !!:0 !!:2 echo b
!!:n-m n번째 ~ m번째 args echo !!:1-3 echo a b c
!!:n-$ n번째 ~ 마지막 args echo !!:2-$ echo b c d
!^ 첫번째 arg echo !^ echo a
!$ 마지막 arg echo !$ echo d
!* 모든 args echo !* echo a b c d

특수한 변수들

form 설명
$? 마지막으로 실행한 프로그램의 종료 상태. 정상 종료이면 보통 0.
$! 마지막으로 실행한 백그라운드 프로그램의 PID.
$$ 현재 셸의 PID.
$0 현재 실행중인 셸 스크립트의 파일명.
$_ 이전에 실행한 명령의 마지막 arg.
  • $_!$와 비슷한 느낌으로 쓸 수 있지만 $_는 변수라는 점이 차이가 있다.

vim session 디렉토리로 cd

  • vim 세션으로 정해 둔 디렉토리로 쉽게 이동할 수 있다.
  • fzf에 의존성이 있다.
function session_directory {
    cd $HOME$(grep -e 'cd\s' ~/.vim/session/* | sed 's/^.*:cd//' | sort | fzf | sed 's/ ~//')
}