폴더에 "로컬"bash 기록이 기억 나십니까?


11

긴 인수와 함께 사용하는 폴더에 스크립트가 있습니다. 전체 히스토리를 다시 돌아 가지 않고 특정 디렉토리에서 명령 히스토리를 실행할 수있는 가능성이 있습니까?


3
흥미로운 질문입니다. BTW는 "전체 히스토리를 통해"되돌아가는 대신 Ctrl + R을 사용하여 검색 할 수 있습니다.
phk

그래, 그것은 도움이되지만 이런 식으로 나는 마지막 것을 가지고 있습니다. 하나 이상의 결과를 가질 가능성이 있습니까?
faber

1
명령 이름의 일부를 입력 한 후에는 Ctrl + R을 계속 누를 수 있습니다.
mtahmed

history | less혹시? 실제로 귀하의 질문에 대답하지는 않지만 시작하는 곳입니다.
roaima

@roaima 그리고 검색하여 "/" + 검색 용어 + 입력 한 후 "N"/ "N" 전방 / 후방으로 추가 검색을위한이.
phk

답변:


2

bash의 PROMPT_COMMAND에 연결하면 새 프롬프트가 표시 될 때마다이 함수가 실행되므로 사용자 정의 히스토리를 원하는 디렉토리에 있는지 확인해야합니다. 이 함수에는 네 가지 주요 분기가 있습니다.

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

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

0

Jeff의 대답 은 단일 디렉토리에 대한 히스토리를 원할 경우 훌륭하지만 zsh 설치에 문제가없는 경우 per-history-directory 를 사용 하여 모든 디렉토리의 디렉토리에 특정한 히스토리를 얻을 수 있습니다.

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

brew install zsh

또는 oh-my-zsh 를 설치하려면 histdb 플러그인을 추가하고 histdb 가 추가 하는 sqlite db를 쿼리하기위한 사용자 지정 쿼리를 작성할 수 있습니다 . 필자는 Dev Diaries 게시물 에 자동 완성 기능을 추가 했습니다. 보너스 명령 섹션을 확인하십시오 .

쿼리는 다음과 같습니다

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

예를 들어.


-1

긴 인수가있는 명령을 여러 번 사용해야 할 때 일반적으로 별칭을 만들 ~/.bash_aliases거나 원하는 ~/.bashrc경우 별칭을 넣을 수 있습니다 . 역사상 이전 명령을 찾는 것이 쉽고 시간이 절약됩니다.


1
좋은 힌트이지만 OP가 찾고있는 것은 아닙니다. OP는 자신이 찾고 있던 것에 대해 매우 구체적이었습니다.
phk

@phk 네 말이 맞아, 다음에 더 조심 할게! 설명해 주셔서 감사합니다!
andreatsh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.