Mac 터미널이 동일한 두 개의 연속 명령을 기억하는 이유는 무엇입니까? 키를 클릭합니다. 우분투에서는

나는 최근에 그리고 우분투에서 일하기 전에 맥을 사용하기 시작했다.

터미널에서이 명령을 하나씩 실행한다고 가정 해보십시오.

python3 main.py
python3 main2.py
python3 main2.py
python3 main2.py
python3 main2.py
python3 main2.py
python3 main2.py

이제 python main.py다시 실행하고 싶다고 가정 하고 up 키를 클릭합니다. 우분투에서는 두 번만 클릭하고 Mac에서는 7 번 클릭해야합니다.

두 개의 연속 된 명령이 동일하면 터미널은 두 개의 다른 명령을 기억하는 대신 하나의 명령 만 기억해야합니다.

macOS에서 어떻게 할 수 있습니까?



답변

HISTCONTROL 환경 변수를에 추가해야합니다 .bash_profile. 당신에 .bash_profile추가 다음 줄 :

export HISTCONTROL=ignoreboth:erasedups

bash 세션을 닫았다가 다시 시작하면 듀피가 사라집니다. 또는 동일한 행을 실행할 수 있으며 해당 세션에 적용됩니다 (테스트에 사용).


(터미널) 의 매뉴얼 페이지bash 에서 :

HISTCONTROL
명령이 내역 목록에 저장되는 방법을 제어하는 ​​콜론으로 구분 된 값 목록입니다. 값 목록에 ignorespace가 포함 된 경우 공백 문자로 시작하는 행은 히스토리 목록에 저장되지 않습니다. ignoreups 값은 이전 히스토리 항목과 일치하는 행을 저장하지 않습니다. 값 ignoreboth은 속기이다 ignorespaceignoredups . erasedups 값은 해당 행이 저장되기 전에 현재 행과 일치하는 모든 이전 행이 히스토리 목록에서 제거되도록합니다. 위 목록에없는 값은 무시됩니다. HISTCONTROL 인 경우설정되지 않았거나 유효한 값을 포함하지 않으면 셸 파서가 읽은 모든 행이 HISTIGNORE 값에 따라 히스토리 목록에 저장됩니다 . 다중 행 복합 명령의 두 번째 및 후속 행은 테스트되지 않으며 HISTCONTROL 값에 관계없이 히스토리에 추가됩니다 .


답변

왜 이런 일이 발생합니까?

MacOS와 Ubuntu는 bash의 명령 기록에서 중복을 처리하도록 기본적으로 다르게 구성됩니다. 이러한 구성은 소위 ” 도트 파일 “에 저장됩니다. 시스템 전체의 / etc / profile뿐만 아니라 ~ / .bash *의 형식을 사용합니다. 이러한 모든 파일은 원하는대로 사용자 정의 할 수 있으며 대화식 쉘, 로그인 쉘, 원격 쉘 등을 구별 할 수 있습니다 .이 파일은 특정 순서 로 읽히고 특정 기능을 수행합니다.

macOS에서 동일한 동작을 얻는 방법은 무엇입니까?

“명령 줄의 정확한 복제본 무시”에 대한 단일 사용자 정의를 원한다면 Allan의 대답과 같은 방법으로 갈 수 있습니다. 예를 들어 bash_profile 파일에 단일 단일 행을 추가하십시오. “적절한 방법”은 없지만 수많은 옵션이 있습니다.

경우이 bash는 다음이에 대한 유일한 정의하지 않습니다 없는 최선의 선택이 될 :

다른 참고 사항 :

  • 그래픽 응용 프로그램 또는 sh (또는 sh로 호출 된 bash)에 사용할 수있는 것은 ~ / .profile에 있어야합니다.
  • ~ / .bashrc는 아무것도 출력하지 않아야합니다.
  • 로그인 쉘에만 사용할 수있는 것은 ~ / .profile에 있어야합니다.
  • ~ / .bash_login이 존재하지 않는지 확인하십시오.

일을 더 복잡 얻을 때 즉,이다 좋은 생각 하기 에 퍼져 여러 파일에 사용자 정의한 내용을, 그들 각각의 전문 매우 그 내용에 정렬 :

exports단순화 된 감독을 위해 모두 자신의 파일에 상주 할 수 있습니다.

bash가 사용자 디렉토리의 루트에있는 파일을 작성하십시오 (예 .exports: 다음을 포함).

# Omit duplicates and commands that begin with a space from history.
export HISTCONTROL='ignoreboth'; 

대화식 시작시 bash가 파일을 읽을 수 있도록 “소스”가되어야합니다.

파일 소싱
쉘 구성이 많은 경우, 여러 개의 서브 파일로 분할하고 소스 내장을 사용하여 .bashrc에서로드하여 추가 source ~/.exports할 수 있습니다.

또는로드하기 전에 파일이 실제로 존재하는지 확인

if [ -f ~/.exports ]; then
. ~/.exports
fi

명령 . ~/.exports~/.exports현재 실행중인 쉘의 컨텍스트에서 소스 됩니다.

별명을 추가 할 때 특히 유용합니다. 별도의 파일을 사용하면 변경시 별명을 쉽게 다시로드 할 수 있습니다.


답변

모든 새로운 명령을 확실하게 기록하는 것은 까다 롭습니다. 먼저 다음을 추가 ~/.profile하거나 유사하게 해야합니다
.

HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'

그런 다음에 추가해야합니다 ~/.bash_logout.

history -a
history -w


답변