사용자 정의 zshrc를 사용하여 zsh 시작

사용자 정의 zshrc를 사용하여 zsh 시작

다음 명령과 유사한 사용자 정의 rc 파일을 사용하여 zsh를 시작할 수 있기를 원합니다.bash --rc-file /path/to/file

source /path/to/file이것이 가능하지 않은 경우 zsh를 시작하고 실행 한 다음 동일한 zsh 세션을 유지할 수 있습니까 ?

참고: 이 명령은 zsh --rcs /path/to/file적어도 나에게는 작동하지 않습니다...

편집: 전반적으로 다음 작업을 수행할 수 있기를 원합니다. ssh원격 서버 "example.com"으로 이동하여 내 구성이 있는 zsh실행 을 모두 1개의 명령으로 수행합니다. 특히 원격 시스템의 구성 파일을 덮어쓰고 싶지 않기 때문에 이것이 제가 어려움을 겪어온 부분입니다.source/path/to/file

답변1

매뉴얼 페이지에서:

STARTUP/SHUTDOWN FILES
       Commands are first read from /etc/zshenv; this cannot be overridden.  Subsequent  be‐
       haviour is modified by the RCS and GLOBAL_RCS options; the former affects all startup
       files, while the second only affects global startup files (those shown here  with  an
       path starting with a /).  If one of the options is unset at any point, any subsequent
       startup file(s) of the corresponding type will not be read.  It is also possible  for
       a  file  in  $ZDOTDIR  to  re-enable  GLOBAL_RCS.  Both RCS and GLOBAL_RCS are set by
       default.

       Commands are then read from $ZDOTDIR/.zshenv.  If the shell is a  login  shell,  com‐
       mands are read from /etc/zprofile and then $ZDOTDIR/.zprofile.  Then, if the shell is
       interactive, commands are read from /etc/zshrc and then $ZDOTDIR/.zshrc.  Finally, if
       the shell is a login shell, /etc/zlogin and $ZDOTDIR/.zlogin are read.

       When a login shell exits, the files $ZDOTDIR/.zlogout and then /etc/zlogout are read.
       This happens with either an explicit exit via the exit  or  logout  commands,  or  an
       implicit exit by reading end-of-file from the terminal.  However, if the shell termi‐
       nates due to exec'ing another process, the logout files are not read.  These are also
       affected  by  the  RCS and GLOBAL_RCS options.  Note also that the RCS option affects
       the saving of history files, i.e. if RCS is unset when the shell  exits,  no  history
       file will be saved.

       If  ZDOTDIR  is unset, HOME is used instead.  Files listed above as being in /etc may
       be in another directory, depending on the installation.

       As /etc/zshenv is run for all instances of zsh, it is important that it  be  kept  as
       small  as  possible.  In particular, it is a good idea to put code that does not need
       to be run for every single shell behind a test of the form `if [[  -o  rcs  ]];  then
       ...' so that it will not be executed when zsh is invoked with the `-f' option.

ZDOTDIR따라서 zsh가 다른 도트 파일 세트를 찾을 수 있도록 환경 변수를 새 디렉토리로 설정할 수 있어야 합니다 .

매뉴얼 페이지에 나와 있듯이 RCSGLOBAL_RCSrc 파일에 대한 경로가 아니지만(사용하려고 할 때) 옵션을 활성화하거나 비활성화할 수 있습니다. 예를 들어, 이 플래그는 zsh가 rc 파일에서 읽도록 하는 옵션을 --rcs활성화합니다 . RCSzsh에 대해 다음 명령줄 플래그를 사용하여 활성화 RCS하거나 비활성화할 수 있습니다 GLOBAL_RCS.

  --globalrcs
  --rcs
  -d    equivalent to --no-globalrcs
  -f    equivalent to --no-rcs

다른 질문에 대답하려면:

zsh를 시작하고 "source /path/to/file"을 실행한 다음 동일한 zsh 세션을 유지할 수 있습니까?

예, 위의 지침에 따르면 매우 쉽습니다. 그냥 실행 zsh -d -f하고 source /path/to/zshrc.

답변2

zshZDOTDIR을 사용하면 귀하가 선택한 모든 디렉토리에서 해석이 파일로 호출되도록 지시할 수 있지만 .zshrc, 귀하가 선택한 파일(반드시 호출할 필요는 없음)을 해석하도록 하는 것은 .zshrc꽤 어려운 것으로 입증되었습니다.

sh또는 ksh시뮬레이션 에서 ;를 zsh평가하여 맨 위에 추가 하고 다음을 수행할 수 있습니다.$ENVemulate zsh/path/to/file

ssh -t host 'zsh -c "ARGV0=sh ENV=/path/to/file exec zsh"'

또 다른 매우 복잡한 접근 방식은 다음과 같습니다.

ssh -t host 'PS1='\''${${functions[zsh_directory_name]::="
    set +o promptsubst
    unset -f zsh_directory_name
    unset PS1
    . /path/to/file
 "}+}${(D):-}${PS1=%m%# }'\' exec zsh -o promptsubst -f

이 질문에는 약간의 설명이 필요합니다.

${foo::=value}실제로는 변수 확장입니다.세트 $foo. $functions함수 이름을 해당 정의에 매핑하는 특수 연관 배열입니다.

promptsubst옵션을 사용하면 변수의 변수가 $PS1확장됩니다. 따라서 첫 번째 프롬프트에서 PS1의 변수가 확장됩니다.

이 기능은 확장 및 반전을 zsh_directory_name돕는 특수 기능입니다 . 예를 들어, 현재 디렉토리가 <=> 매핑을 통해 표시될 수 있도록 프롬프트에서 사용됩니다 . 매개변수 확장 플래그에서도 사용됩니다. 따라서 확장되면 이 함수가 호출됩니다.~foo/path/to/something%~/opt/myproj/proj/x~proj:xzsh_directory_nameproj:x/opt/myproj/proj/xD${(D)somevar}zsh_directory_name

${(D):-}여기서는 가 비어 있으면 확장 ${:-}되어 ${no_var:-nothing}호출 될 때 비어 있게 확장되는 를 사용합니다 . 이전에는 다음과 같이 정의되었습니다.nothing$no_var${(D):-}zsh_directory_namezsh_directory_name

zsh_directory_name() {
  set +o promptsubst
  unset -f zsh_directory_name
  unset PS1; . /path/to/file
}

즉, PS1이 처음으로 확장될 때(첫 번째 프롬프트에서) 옵션이 설정 해제(취소 ), 정의 ${(D):-}해제 (한 번만 실행하려고 하기 때문에) , 설정 해제 및 소스가 제공됩니다.promptsubst-o promptsubstzsh_directory_name()$PS1/path/to/file

${PS1=%m%# }PS1이 정의되지 않은 경우(예: after ) 를 확장(및 할당 $PS1) 하며 이는 기본값이 됩니다 .%m%#/path/to/fileunset%m%#PS1

관련 정보