zsh와 bash간에 별명 및 PATH 설정 공유


24

내가 일반적으로 사용하는 쉘은 zsh입니다. ls및과 같은 일부 프로그램에서 색상을 활성화하는 별칭이 여러 개 grep있습니다. 또한 표준이 아닌 장소 (예 :에서 ~/bin/) 에서 프로그램을 실행할 수 있도록 사용자 지정 경로를 설정했습니다 .

나는 루트의 쉘 변경되지 않습니다 에를 zsh,하지만 난 그 루트뿐만 아니라 그것을 가질 수 있도록 이러한 설정을 공유하고 싶습니다. 나는 zsh그것이 소싱이 아니라는 것을 안다 /etc/profile. 에서 소스를 제공 할 수 /etc/zsh/zprofile있지만 다른 "적절한"방법을 원합니다.

답변:


16

나는 파일을 만들 것 /etc/commonprofile모두에 소스 /etc/profile와 /etc/zsh/zprofile. 이를 통해 공통 설정을 공유하고 bash각각 zsh특정 설정과 구문을 계속 사용할 수 /etc/profile있습니다 zprofile.


다른 좋은 답변 중에서 나는 이것이 가장 단순하고 "깨끗한"나에게 적합하다고 생각한다
— phunehehe

"source it"은 무슨 뜻인가요?
— Hlung

@Hlung 쉘 프로파일 확장 성을로드하기 위해 여기에 'source /path/to/.shell_profile'이옵니다. 'source'의 매뉴얼 페이지를 참조하십시오.
— Itachi 2016 년

17

Zsh에는 sh 호환성 모드가있어 POSIX sh 코드 및 일부 bash 확장을 실행할 수 있습니다. zsh에없는 bash 기능을 사용하지 않는 한 (동일한 구문으로) 두 쉘에서 동일한 파일을 제공 할 수 있습니다. emulate내장 기능을 사용하여 zsh를 호환 모드로 설정하십시오. 과 -L옵션, 에뮬레이션은 포함하는 기능 (하지 둘러싸는 소스 스크립트)에 지역이다.

source_sh () {
  emulate -LR sh
  . "$@"
}

환경 변수와 같은 경우 프로파일 파일이 bash 특정 기능을 사용하지 않기 때문에 source_sh /etc/profilein /etc/zprofile및 source_sh ~/.profilein ~/.zprofile을 사용할 수 있습니다.

별명 및 함수 정의와 같은 경우, rc rc 파일은 공유 할 수없는 많은 것 (프롬프트, 키 바인딩, 완료 설정 등)을 포함 할 가능성이 높기 때문에 ~/.sh_aliases소스 ~/.bashrc및 source_sh'd 에서 ~/.zshrc.


2
"길레스의 모든 답변을 자동으로 공표"하는 방법이 있어야합니다. 시간이 많이 절약됩니다. 사실, 당신의 대답은 흔들립니다. 항상 정확하고 잘 작성되고 포괄적입니다.
— fschmitt

@ fschmitt : 동의합니다. 그리고 편집되지 않은 것을 볼 수 있습니다! 여기에 제공된 힌트는 정말 좋습니다.
— 누군가 아직도 당신을 사용합니다 MS-DOS

4

간단한 심볼릭 링크는 어떻습니까?

ln -s /etc/profile /etc/zsh/zprofile

조건부 초기화가 필요한 경우 다음과 같이 추가 할 수도 있습니다.

#Determine our shell without using $SHELL, which may lie
shell="sh"
if test -f /proc/mounts; then
   case $(/bin/ls -l /proc/$$/exe) in
        *bash) shell=bash ;;
        *dash) shell=dash ;;
        *ash)  shell=ash ;;
        *ksh)  shell=ksh ;;
        *zsh)  shell=zsh ;;
    esac
fi

흠 그러나 나는 이것을 소싱하는 것보다 더 깨끗하다고 ​​생각하지 않습니다. zsh와 bash가 모두 읽을 파일이 있습니까?
— phunehehe

소싱 또는 심볼릭 링크 생성이 "깨끗한"솔루션이 아니라고 생각하는 이유는 무엇입니까?
— echox

필자는 필요한 경우 symlink를 관리하는 대신 파일을 소스로 만들고 싶습니다. 파일간에 많은 의존성을 만들고 싶지 않습니다.
— phunehehe

1
보다 이식 가능한 대안은 /bin/ls -l /proc/$$/exe입니다 ps -o comm= -p $$. 일부 쉘은 호출 방식에 따라 다르게 동작하기 때문에 완전히 신뢰할 수는 없습니다. 간단하게 테스트 연습 $0에 .profile더 나은 표시 될 가능성이 높습니다. 그러나 유용한 기능 (bash는, KSH, zsh을)를 제공하는 대부분의 쉘은 단순히 인식 (그리고 큰 플러스입니다 확인 자신의 버전) 할 수있는 몇 가지 변수를 테스트하여 : $BASH, $BASH_VERSION, $BASH_VERSINFO, $KSH_VERSION, ${.sh.version}; $ZSH_VERSION.
— Gilles 'SO- 악마 그만해'11

echox, 귀하의 사례 설명이 zsh4를 올바르게 감지하지 못함 # $ SHELL을 사용하지 않고 쉘을 결정하십시오. test -f / proc / mounts 인 경우 shell = "sh"일 수 있습니다. bash의 경우 $ (/ bin / ls -l / proc / $$ / exe) case shell = bash ;; * dash) shell = 대시 ;; * ash) shell = ash ;; * ksh) 쉘 = ksh ;; * zsh ) 쉘 = zsh ;; #shsh esac fi와 일치
— Bryan Hunt

0

변수와 관련하여 모듈 및 모듈 파일이 누락되었다는 인상을 받았습니다 [1]. 일단 시작하면 단일 모듈 파일의 편리함에서 다양한 셸 (bash & zsh 포함), python, perl 및 더 많은 환경에 대한 공통 프로파일을 쉽게 작성할 수 있습니다.

같은 방식으로 별칭을 정의 할 수도 있습니다. 그러나 연속 쉘에서 별칭이 잘 상속되지 않으며 해결 방법이 필요할 수 있습니다.

[1] http://en.wikipedia.org/wiki/Environment_Modules_ (소프트웨어)

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