도트 파일을 시스템에 무관하게 유지하는 방법?


21

작업으로 인해 최근 OS X 사용을 시작했으며 Linux와 비슷한 경험을 얻기 위해 homebrew를 사용하여 설정했습니다.

그러나 설정에는 약간의 차이가 있습니다. 일부는 하나의 시스템에만 설치하면됩니다. 내 도트 파일이 git 리포지토리에 살고 있기 때문에 어떤 종류의 스위치를 설정할 수 있는지 궁금해하여 일부 구성은 Linux 시스템과 OS X 용으로 만 읽을 수 있습니다.

도트 파일에 관해서는 무엇보다도 .bash_profiles또는을 참조하고 .bash_alias있습니다.


나는 자식 가지로 이것을했다. FreeBSD, Gentoo 및 Ubuntu 용으로 하나 있습니다. 그러나 이것은 이상적이지 않습니다.
Raphael Ahrens

@RaphaelAhrens 분기하기 쉬운 분기 기반 솔루션을 피하고 싶습니다.
k0pernikus

예, 시스템 관련 항목을 특수 파일에 넣을 때 조금 더 쉽게 만들 수 있습니다. 그러나 내가 이상적이지 않다고 말한 것처럼.
Raphael Ahrens

stackoverflow.com/questions/394230/… OS X에서 Darwin을 확인할 수 있습니다.
Raphael Ahrens

내 접근 방식은 기본적으로로 압축 if (exists rcfile.local); source rcfile.local; endif되어 적절한 rc 파일로 변환됩니다. 주 rc 파일은 시스템에 독립적으로 유지하려고하지만 .local버전에는 시스템 특정 설정이 있습니다. 단일 저장소에서 모두 원한다면 시스템 디렉토리가 있고 rcfile.local을 올바른 디렉토리의 심볼릭 링크로 연결할 수 있습니다.
jw013

답변:


22

도트 파일을 가능한 한 이식성있게 유지하고 특정 버전의 도구가 필요한 OS 종속 설정이나 스위치를 피하십시오 (예 : 모든 시스템에서 GNU 소프트웨어를 사용하지 않는 경우 GNU 구문을 피하십시오).

시스템 특정 설정을 사용하는 것이 바람직한 상황에 처할 수 있습니다. 이 경우 개별 설정과 함께 switch 문을 사용하십시오.

case $(uname) in
  'Linux')   LS_OPTIONS='--color=auto --group-directories-first' ;;
  'FreeBSD') LS_OPTIONS='-Gh -D "%F %H:%M"' ;;
  'Darwin')  LS_OPTIONS='-h' ;;
esac

임의 응용 프로그램의 구성 파일에 다른 옵션이 필요한 경우 응용 프로그램이 호환성 스위치 나 다른 메커니즘을 제공하는지 확인할 수 있습니다. 예 vim를 들어, 이전 버전 또는 다른 기능 세트로 컴파일 된 버전에는없는 기능을 지원하도록 버전 및 패치 레벨을 확인할 수 있습니다. 의 스 니펫 예제 .vimrc:

if v:version >= 703
  if has("patch769")
    set matchpairs+=“:”
  endif
endif

uname -s같다 uname. uname은 Unix 이름을 나타냅니다.
Stéphane Chazelas

1
@StephaneChazelas 시스템 전체에서 발생했거나 보장되며 항상 삭제할 수 -s있습니까?
Marco

1
그렇습니다. uname혼자서 수십 년 동안 정식 방법을 사용했으며 POSIX에 의해 지정되었습니다. 원본 uname(PWB Unix)은 옵션을 사용하지 않았습니다.
Stéphane Chazelas

@StephaneChazelas 설명을 해주셔서 감사합니다. -s이 답변에서 답변을 삭제했으며 앞으로의 스크립트에 대해 명심하겠습니다.
Marco

상대적으로 사소한 세부 사항이며 귀하의 예에 설명 된 요점에서 벗어나지 않지만 vimrc의 인용문은 set실제로 U + 0022가 아닌 U + 201C 및 U + 201D이어야합니까?
CVn

3

.bash_profiles 및 friends와 같이 실제로 실행되는 파일에만 관심이 있다면 예 uname를 들어 코드가 실행되는 시스템을 기반으로 차별화 하는 데 도움이 될 수 있습니다 .

예를 들어 , 완전히 테스트되지 않았으며 현재 Linux를 사용하는 경우 시도 할 OS X가 없다는 경고가 있습니다.

alias ll='ls -lFA'

Mac OS X의 경우 :

alias ll='ls -lFAx'

( -xOS X가 lsGNU ls가 기본적으로하는 일을하게한다면) 다음과 같이 결합 될 수 있습니다 :

OS="$(uname -s)"
if test "$OS" = "Darwin"; then
    alias ll='ls -lFAx'
    # ...other OS X-specific things go here...
else if test "$OS" = "Linux"; then
    alias ll='ls -lFA'
    # ...other Linux-specific things go here...
fi
# ...generic things go here...

유일한 요구 사항은 uname -s대부분 같은 방식으로 작동 한다는 것입니다 (두 시스템 모두 POSIX-y가 적당하고 POSIX에 uname -s가 필요하기 때문에 ( Marco이것을 지적 했기 때문에)) 쉘 스크립트 브랜칭 구문 문자열 비교를 기반으로 동일합니다. 다른 기준에 따라 테스트 할 수도 있습니다. 예를 들어, / etc / lsb_release를 찾거나 / proc / sys / kernel / ostype에 "Linux"가 포함되어 있는지 확인하거나 다른 테스트를 수행 할 수 있습니다.


@RaphaelAhrens 그것은 Darwin방금 확인했습니다.
k0pernikus

@RaphaelAhrens 내가 쓴 것처럼, 나는 일을 시도 할 OS X가 없기 때문에 OP가 사소하게 알 수있는 상대적으로 중요하지 않은 세부 사항에 많은 시간을 소비하는 대신 아이디어를 보여주기 위해 거친 추측을했습니다.
CVn

다른 누군가가 Windows 또는 다른 것들을 위해 bash를 원할 경우 구조 en.wikipedia.org/wiki/Uname 에 대한 Wikipedia .
Raphael Ahrens

1
uname -o스위치는 POSIX가 아니며 많은 시스템 (예 : Solaris)에서 실패합니다. -sPOSIX에서는 필수이며 가장 호환 가능한 방법입니다. IEEE 표준 1003.1
Marco

2
OSTYPEPOSIX 쉘에서는 사용할 수 없습니다. 예를 들어 기본 FreeBSD 설치에서는 실패하며 .bashrc또는 에서만 사용할 수 있습니다 .zshrc. 그것은 안정적으로 작동하지 않습니다 .profile, .alias대신 모든 시스템에서 사용할 수 보장 할 수 없습니다 특정 쉘의 기능에 의존, 우리가 여기 compatibiliy에 대해 얘기하고 있기 때문에, 나는 안전한 방법을 가서 조언을 것 등.
Marco
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.