Mac 터미널이 동일한 두 개의 연속 명령을 기억하는 이유는 무엇입니까?


10

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

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

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에서 어떻게 할 수 있습니까?


6
pedantic에게만, 실제로 이것을하는 맥 터미널이 아닙니다. bash는 터미널에서 실행되는 쉘입니다. 많은 쉘이 있으며 기본 쉘을 다른 것으로 대체하고 zsh 를 다양한 스크립트 zsh사용자 정의 하는 것이 가능하고 일반적 입니다.
gman

답변:


13

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

export HISTCONTROL=ignoreboth:erasedups

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


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

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


4

왜 이런 일이 발생합니까?

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현재 실행중인 쉘의 컨텍스트에서 소스 됩니다.

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


2
.exports읽기 (소스) 는 어떻게 얻습니까?
fd0

1
@ fd0, 그 자체로는 macOS에서 소스되지 않습니다. Allan의 대답은이를 달성하기위한 올바른 방법입니다.
user3439894

의 값 HISTCONTROL이 설정되어 .bashrc있고 ~/.bashrc소스 인 경우 변수 ~/.bash_profile가 필요하지 않습니다 . 대화식 로그인 쉘과 대화식 쉘 모두 변수가 설정됩니다. exportHISTCONTROL
fd0

@ fd0 정확히 : if . / 이해할 수없는 경우 : 내 요점은 Allan의 동시에 게시 된 A / & esp _profile을 유지하는 데 많은 대안을 제공하는 것이었지만 나머지는 가능한 한 깨끗하고 깔끔합니다. 많은 옵션 / 설정이 고려되는 시나리오이기 때문입니다. 위의 방법을 '잘못된'것으로 인식 할 수있는 마지막 요점은 추가하거나 수정을 의미합니까? 자, 나는 당신과 내가 Allan 사이에 복잡성 수준에서 언급 한 것을 읽었습니까?
LаngLаngС

1

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

HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'

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

history -a
history -w
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.