폴더의 "로컬" bash 기록을 기억하시나요?

폴더의 "로컬" bash 기록을 기억하시나요?

긴 매개변수를 사용하는 폴더에 스크립트가 있습니다. 전체 기록을 반환하는 대신 해당 특정 디렉터리에서 실행된 명령 기록을 얻을 수 있나요?

답변1

bash의 PROMPT_COMMAND를 후킹하면 새로운 프롬프트가 수신될 때마다 이 함수가 실행되므로 지금이 기록을 사용자 정의하려는 디렉터리에 있는지 확인하는 좋은 시간입니다. 이 함수에는 네 가지 주요 분기가 있습니다.

  1. 현재 디렉터리( $PWD)가 변경되지 않은 경우 아무 작업도 수행하지 않습니다(반환).

장애가 있는 사람의 경우가지다변경한 다음 "사용자 정의 디렉터리" 코드를 한 곳으로 나누는 것이 유일한 목적인 로컬 함수를 설정합니다. 내 테스트 디렉토리를 사용자 고유의 디렉토리(구분된 )로 바꿔야 합니다 |.

  1. 사용자 정의 디렉토리로 변경하지 않았거나 사용자 정의 디렉토리로 변경하지 않은 경우 "이전 디렉토리" 변수를 업데이트하고 함수에서 반환됩니다.

디렉토리를 변경했으므로 이전 디렉토리 변수를 업데이트한 다음 메모리 내 기록을 HISTFILE에 저장하고 메모리 내 기록을 지웁니다.

  1. 우리가 바꾸면입력하다디렉터리를 사용자 정의하고 HISTFILE을 .bash_history현재 디렉터리의 파일로 설정합니다.

  2. 그렇지 않았다면 우리 모두는 변했을 거예요밖의디렉토리를 사용자 정의하여 HISTFILE을 스톡 디렉토리로 재설정하십시오.

마지막으로 히스토리 파일을 변경했으므로 이전 히스토리를 다시 읽어보세요.

원활한 실행을 유지하기 위해 스크립트는 PROMPT_COMMAND 값을 설정하고 내부적으로 사용되는 두 개의 변수(인벤토리 HISTFILE 및 "이전 디렉터리")를 저장합니다.

prompt_command() {
  # if PWD has not changed, just return
  [[ $PWD == $_cust_hist_opwd ]] && return

  function iscustom {
    # returns 'true' if the passed argument is a custom-history directory
    case "$1" in
      ( */tmp/faber/somedir | */tmp/faber/someotherdir ) return 0;;
      ( * ) return 1;;
    esac
  }

  # PWD changed, but it's not to or from a custom-history directory,
  # so update opwd and return
  if ! iscustom "$PWD" && ! iscustom "$_cust_hist_opwd"
  then
    _cust_hist_opwd=$PWD
    return
  fi

  # we've changed directories to and/or from a custom-history directory

  # save the new PWD
  _cust_hist_opwd=$PWD

  # save and then clear the old history
  history -a
  history -c

  # if we've changed into or out of a custom directory, set or reset HISTFILE appropriately
  if iscustom "$PWD"
  then
    HISTFILE=$PWD/.bash_history
  else
    HISTFILE=$_cust_hist_stock_histfile
  fi

  # pull back in the previous history
  history -r
}

PROMPT_COMMAND='prompt_command'
_cust_hist_stock_histfile=$HISTFILE
_cust_hist_opwd=$PWD

답변2

제프의답변단일 디렉토리의 기록을 원하지만 설치에 동의하는 경우에는 좋습니다.다루기 힘든당신은 그것을 사용할 수 있습니다각 히스토리 디렉토리이 디렉토리와 관련된 모든 디렉토리의 기록을 가져옵니다.

다음을 통해 zsh를 설치할 수 있습니다.

brew install zsh

아니면 설치를 원하시면아 맙소사, 추가할 수 있습니다과거 데이터베이스histdb에 의해 추가된 sqlite 데이터베이스를 쿼리하기 위해 플러그인을 사용하고 사용자 정의 쿼리를 작성합니다. 나는 그것에 대해 글을 쓰고 게시했습니다.개발일지우편 엽서. 조사하다보너스 명령부분.

쿼리는 다음과 같습니다

show_local_history() {
    limit="${1:-10}"
    local query="
        select history.start_time, commands.argv 
        from history left join commands on history.command_id = commands.rowid
        left join places on history.place_id = places.rowid
        where places.dir LIKE '$(sql_escape $PWD)%'
        order by history.start_time desc
        limit $limit
    "
    results=$(_histdb_query "$query")
    echo "$results"
}

이는 선택적 제한도 허용합니다.

show_local_history 50

예를 들어.

답변3

긴 인수가 포함된 명령을 여러 번 사용해야 하는 경우 일반적으로 my에 별칭을 만들거나 원하는 경우 ~/.bash_aliasesyour에 넣습니다. ~/.bashrc이는 기록에서 이전 명령을 찾는 대신 쉽고 시간을 절약해 줍니다.

관련 정보