다른 탭에서 공유 금지 내역을 얻는 방법


19

/unix//a/1292/41729 의 답변을 사용하여 별도의 bash 터미널간에 실시간 공유 기록을 활성화했습니다. 위의 답변에서 설명했듯이 다음을 추가하면됩니다.

# avoid duplicates..
export HISTCONTROL=ignoredups:erasedups  
# append history entries..
shopt -s histappend

# After each command, save and reload history
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

bash 쉘이 분리되어 있으면 잘 작동합니다 (예 :을 사용하여 다른 bash 터미널 열기) CTRL+ALT+T.하지만 tabs새 창 대신 (CTRL + SHIFT + T 열린 터미널에서) 사용하면 작동하지 않습니다 . 여러 탭에서 bash 기록을 공유 할 수 있습니까?

업데이트 : 나는 비정상적인 행동을 발견했습니다. CTRL+C입력하면 다른 터미널 중 하나에 입력 한 마지막 명령 (탭 모두 또는 아닙니다)이 올바르게 표시됩니다. CTRL + C가 히스토리를 강제로 비우면 올바르게 공유됩니다.

예를 들어 출력 (T1은 터미널 1과 T2 터미널 2를 나타냄) :

T1:
ls -lah <enter>
# the list of files and directory is shown

T2:
cd Documents <enter>

T1:
<up> (i.e. I press the up arrow)
ls -lah #i.e the last command in terminal 1 is shown rather than the last of terminal 2
^C (i.e. I press CTRL+C)
<up>
cd Documents #the last command issued in terminal 2 is correctly displayed

이것이 힌트를 줄 수 있기를 바랍니다!


~.bashrc파일에 추가 했습니까? 참고로 이러한 변수를 내보내는 것은 의미가 없습니다. 단지 환경 ​​공간을 낭비합니다.
geirha

@geirha 예 .bashrc 파일에 추가했습니다. 수출에 대한 의견에 감사드립니다.
lucacerone 2016

답변:


2

동기화 하기 전에 다른 터미널의 기록에 액세스하려고하는 것 같습니다 . 명령을 실행 한 다음 명령을 입력하기 전에 PROMPT_COMMAND새 프롬프트가 인쇄 되기 직전에 실행됩니다. 따라서 T1에서는 즉시 발생하지 않습니다. 새 프롬프트가 표시되도록해야합니다.

이것을 테스트하려면 단계 에서이 변형을 시도하십시오 ( <enter>T1에 여분을 추가 했습니다).

T1:
ls -lah <enter>
# the list of files and directory is shown

T2:
cd Documents <enter>

T1:
<enter>
<up> (i.e. I press the up arrow)

이 추가 엔터를 누르면 PROMPT_COMMAND기록 을 실행 하고 동기화 하는 새로운 프롬프트가 표시 되므로 원하는대로이 위쪽 화살표가 cd대신 대신 검색 할 것으로 기대합니다 ls. 불행히도, 원하는 것처럼 명령을 실행하지 않고 모든 터미널에서 동기화를 즉시 수행 할 수있는 방법이 없다고 생각합니다. 이를 위해서는 모든 로그인 세션이 항상 내역 목록을 지속적으로 동기화해야하므로 CPU 및 디스크 처리량이 크게 낭비됩니다.


Enter 키를 누르면 동기화가 완료됩니다. ? 메모리 나 CPU의 낭비가있을 경우에도 방법 (너무 많은 내가 할 수있는 항상 해제를하는 경우,하지만 난 그것을 시도주고 싶습니다) 나는 동기화를 강제 할 수
lucacerone

1

나는 같은 질문을했고 여기에 내가 찾은 대답이 있습니다 ....

HISTSIZE=9000
HISTFILESIZE=$HISTSIZE
HISTCONTROL=ignorespace:ignoredups

history() {
  _bash_history_sync
  builtin history "$@"
}

_bash_history_sync() {
  builtin history -a         #1
  HISTFILESIZE=$HISTSIZE     #2
  builtin history -c         #3
  builtin history -r         #4
}

PROMPT_COMMAND=_bash_history_sync


시도하기 전에 두 가지 설명 : 다른 hystory-옵션을 제거해야합니까? 이것은 .bashrc에 들어갑니다.
lucacerone 2016 년

불행히도 그것은 작동하지 않습니다 ...
lucacerone

HISTFILESIZE변경 될 때마다 기존 히스토리 파일 자르기를 자동으로 시도합니다. 변화 HISTSIZE는 현재 역사에 비슷한 영향을 미칩니다. 참조 variables.c를 위해 bash src 바로 앞에 있는 주석을 참조하십시오 sv_histsize.
브라이언 반덴버그

1

그 줄을 .bashrc파일에 추가 하십시오

# avoid duplicates..
export HISTCONTROL=ignoredups:erasedups  
# append history entries..
shopt -s histappend

trap 'history -r' USR1 
export PROMPT_COMMAND="history -a ; history -c; ps a | awk '/ bash$/ {system (\"kill -USR1 \" \$1)}'; $PROMPT_COMMAND"

노트:

처음에 테스트 베이에서 killall을 사용하여 USR1 신호를 bash에 전송했습니다. 나중에 고유 쉘 이름, testshell이라는 bash 사본을 사용하여 실행할 수는 있지만 (예 : cron 프로세스) 이상한 쉘을 죽이지 않기 위해 생각했습니다. 일.

killall은 충분히 선택적이지 않았으며, bash에 bash 프로세스를 단단히 죽이는 스크립트로 대체했습니다 (tty에 ps a연결된 프로세스 만보고)

새로운 PROMPT_COMMAND를 갖기 위해 세션을 다시 시작하는 것을 잊지 마십시오. 테스트 할 때 PROMPT_COMMAND에 이전의 많은 테스트가 쌓여있는 것을 보았습니다.


새로운 사용자와 다른 쉘이 필요하지 않습니다 killall. 추가 -u인수 , e.g. -u $ (whoami)`를 사용하여 동일한 사용자의 프로세스에만 신호를 보내도록 지시 할 수 있습니다 .
필립 웬 들러

csh의 구문이 잘못되었다고 생각합니다 ... @PhilippWendler 조금 더 자세히 설명해 주시겠습니까?
lucacerone

문제는 bash에 관한 것이므로 bash 구문을 사용했습니다. 나는 csh를 모른다. bash의 경우 killall -q -USR1 -u $(whoami) bashUSR1 신호를 현재 사용자의 모든 bash 프로세스로 보냅니다.
필립 웬 들러

@Philipp ty btw 전용 쉘 솔루션을 테스트하지 않았으므로 cron bash 스크립트가 실행되는 경우를 수정했습니다.
Emmanuel

@LucaCerone 내가 다시 쓴 것 같습니다
Emmanuel

0

Yakuake에서 다른 로그인 수를 보여주는 정교한 bash 프롬프트를 만들려고 할 때도 똑같은 이상한 행동을했습니다. 탭의 수가 증가하지 않았습니다. 내 해결 방법은 bash모든 새로운 탭에서 Yakuake를 다시 실행 하여 본질적으로 bash에서 bash를 시작하는 것입니다. 그것은 완벽하게 작동하기 시작했습니다. 도움이 될 수도 있습니다. 콘솔의 GUI는 bash 구성 자체를로드 한 다음 bash 인스턴스에 공급한다고 생각합니다. 그들과 함께 바이올린을 칠 수있을 것입니다.


나는 bash에 bash를로드하려고했지만 성공하지 못했습니다 :(
lucacerone
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.