터미널의 탭을 여러 개 열어 작업할 때 설정하여 편리했던 것

8414 단어 터미널Bash
터미널의 탭을 여러 개 열어 다른 프로젝트를 동시 병렬로 작업하는 경우가 있었다. 그래서 주로 아래와 같은 2점이 불편했기 때문에, 어떻게든 할 수 있을까라고 생각해 여러가지 해 보았다.

해결하려는 과제


  • 터미널/IDE/에디터 등을 오가면 어떤 탭이 어떤 프로젝트를 열었는지 확실히 알 수 없으므로 즉시 알고 싶습니다
  • 각 탭에서 치는 명령의 내역이 독립적이며

    1. 모든 디렉토리에서 프롬프트의 색상 변경


  • PROMPT_COMMAND라는 쉘 변수가 있으며이 값으로 설정된 명령과 함수는 프롬프트가 표시되기 전에 실행됩니다.
  • 이 쉘 변수로, 임의의 디렉트로 이동 후, 프롬프트의 색을 변경해, 어느 프로젝트를 열고 있는가 색으로 알 수 있도록 한다.
  • 다음 prompt_command_color는 특정 디렉토리로 이동하면 프롬프트에 표시 할 Git의 분기 이름 만 색상을 변경하는 함수입니다.

    .bash_profie
    
    # Gitのbranchを表示
    source /usr/local/etc/bash_completion.d/git-prompt.sh
    source /usr/local/etc/bash_completion.d/git-completion.bash
    GIT_PS1_SHOWDIRTYSTATE=true
    GIT_PS1_SHOWSTASHSTATE=true
    GIT_PS1_SHOWUPSTREAM=auto
    
    # Gitのブランチ名を色付きで表示
    function prompt_command_color () {
        CURRENT=$(basename `pwd`)
        if [ "$CURRENT" = 'directory1' ]; then
            export PS1='\[\e[0;36m\][\u@\h \W]\$\[\e[0m\]\[\033[01;33m\]$(__git_ps1 [%s])\[\033[00m\]\$ '
        elif [ "$CURRENT" = 'directory2' ]; then
            export PS1='\[\e[0;36m\][\u@\h \W]\$\[\e[0m\]\[\033[01;38m\]$(__git_ps1 [%s])\[\033[00m\]\$ '   
        else
            export PS1='\[\e[0;36m\][\u@\h \W]\$\[\e[0m\]\[\033[01;32m\]$(__git_ps1 [%s])\[\033[00m\]\$ '
        fi  
    }
    
    PROMPT_COMMAND=prompt_command_color
    
    

    2. 명령 기록 공유


  • 아래의 기사가 참고가 되었다
    ht tp // 어서 th. dyn dns. rg / mt / 이안 / 아 r ゔ s / 000651. HTML

  • .bash_profie
    
    # コマンド履歴の共有
    function prompt_command_sync_history () {
        history -a # .bash_historyに前回コマンドを1行追記
        history -c # 端末ローカルの履歴を一旦消去
        history -r # .bash_historyから履歴を読み込み直す
    }
    shopt -s histappend    # .bash_history追記モードは不要なのでOFFに
    HISTCONTROL=ignoreboth # コマンドの重複を防ぐ
    
    PROMPT_COMMAND=prompt_command_sync_history
    
    

    1.과 2.의 함수를 PROMPT_COMMAND로 동시에 설정한다.



    1개의 함수로 정리해 가면 곧바로 할 수 있다. 그렇지만, 기능 추가할 때마다 행이 길어지고, 같은 함수로 별개의 처리가 달리기 때문에 괴롭다.

    처리마다 함수를 나누어 PROMPT_COMMAND 로 설정하고 싶다. 그러나 여러 함수를 하나의 쉘 변수로 설정하는 방법을 모르겠습니다.
  • 아래의 기사로 만들어진 살아났다.
    ぃ tp // 이 m / y07212 / ms / 9509 굳이 f6dc3b 7 7 d0c

  • .bash_profie
    
    # 色を変更する関数と、履歴共有の関数をグローバルな変数に入れる
    PROMPT_COMMAND_COLOR=prompt_command_color
    PROMPT_COMMAND_SYNC_HISTORY=prompt_command_sync_history
    
    # PROMPT_COMMANDに複数の関数を割り当てる関数
    function dispatch () {
        for f in ${!PROMPT_COMMAND_*}; do   # ${!HOGE*}は、HOGEで始まる変数の一覧を得る
            eval ${!f}                      # ${!f}は、$fに格納された文字列を名前とする変数を参照する(間接参照・間接展開)
        done
    }
    
    PROMPT_COMMAND=dispatch
    
    

    이런 느낌이 든다


  • PROMPT_COMMAND는 프롬프트가 표시되기 전에 실행되므로 enter를 누르면 명령 기록이 공유됩니다.

    GIF

    번외편 1 : ${!f}


  • 간접 참조라든지 간접 전개라고 불리고 있는
    h tp // 코다마. 후부키. 인후/우우/우우. c기/바 sh/치 ps?ぁg=jp

  • 실시예 1
    $ A=BBB
    $ BBB=1
    $ echo ${A}
    BBB
    $ echo ${!A} # これは eval echo \$$A や eval echo '$'$A と 同じ
    1
    

    번외편 2 : eval echo \$$A 이나 eval echo '$'$A 와 같다?


  • 같았다
    입문 UNIX 쉘 프로그래밍 - 쉘의 기초에서 배우는 UNIX 세계

  • 실시예 2
    $ A=BBB
    $ BBB=1
    $ echo $A
    BBB
    $ echo \$A
    $A
    $ echo $$A # $$はプロセスID(51856)
    51856A
    $ echo \$$A
    $BBB
    $ eval echo \$$A
    1
    $ eval echo '$'$A
    1
    
  • 요컨대, 위에서 자작한 dispatch 라는 함수로 실행하고 있다 eval ${!f} 하는 것이었다.

  • 요약


  • 다양한 화면을 오가는 경우에도 색상으로 깔끔하게 구분할 수 있으며 명령을 공유 할 수있어 편안합니다.
  • bash는 이해하기가 어려웠지만 뭔가 이상하게 끌리는 매력이 있습니다
  • bash 힘이 약간 올랐다
  • 좋은 웹페이지 즐겨찾기