사용자 정의 zshrc로 zsh를 시작하십시오.


17

명령과 비슷한 사용자 정의 rc 파일로 zsh를 시작할 수 있기를 원합니다. bash --rc-file /path/to/file

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

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

편집 : 전체적으로 다음을 수행 할 수 있기를 원합니다 ssh. 원격 서버 "example.com" zsh에 대해 source내 구성을에 위치한 /path/to/file명령을 모두 실행하십시오. 특히 원격 컴퓨터의 구성 파일을 덮어 쓰지 않기 때문에 어려움을 겪었습니다.


1
Katz 안녕하세요, 유닉스에 오신 것을 환영합니다. (약간) 읽기 쉬운 형식을 추가하기 위해 귀하의 질문을 편집했습니다. "편집"을 클릭하여 작동 방식을 확인할 수 있습니다. 또한 "감사합니다"및 서명 (Stack Exchange 네트워크의 모든 게시물은 자동으로 서명 됨)과 같은 추가 항목을 제거했습니다.
drs

1
고마워요, 이제 타이핑하는 법을 배웠습니다 code as such!
hjkatz

답변:


18

매뉴얼 페이지에서 :

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.

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

man 페이지에서 알 수로서, RCS그리고 GLOBAL_RCS당신이 그들을 사용하려고로, RC 파일에 대한 경로 이라기보다는 옵션을 활성화 또는 비활성화 할 수 있습니다. 예를 들어, 플래그 --rcsRCS옵션 을 활성화 하여 zsh가 rc 파일에서 읽도록합니다. 당신은 활성화 또는 비활성화 할 수 zsh을 다음 명령 줄 플래그를 사용할 수 있습니다 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.


이것은 내 질문에 따라 작동하므로 하나의 명령 만 실행할 수 있다고 언급하지 못했습니다. 이것은 내가 이것을 사용하고자하는 것을 만족시키지 않습니다 (개인 구성이있는 사용자 정의 ssh). 문제는 실행 zsh -d -f; source /path/to/file이 종료 될 때까지 zsh의 첫 번째 세션에서 두 번째 명령 을 실행 하지 않는다는 것입니다.
hjkatz

전체적으로 다음을 수행 할 수 있기를 바랍니다. ssh실행 원격 서버 "example.com"에 zsh, source에있는 내 구성 /path/to/file, 1 개 명령의 모든. 특히 원격 컴퓨터의 구성 파일을 덮어 쓰지 않기 때문에 어려움을 겪었습니다. 답변 해 주셔서 감사합니다.
hjkatz

문제가 사용자 정의 zshrc를 사용하는 것이 아니라 ssh를 통해 쉘을 사용하는 방법을 모르는 것 같습니다. 을 실행 ssh host "zsh -d -f; source /path/to/file"하면 ssh가 zsh원격 호스트에서 먼저 실행 된 다음 source ...zsh 쉘이 종료 된 후 실행 됩니다. 대신 ssh -t host zsh -d -f원격 호스트의 대화식 쉘에 넣거나 대화식 쉘을 원하지 않으면 수행하십시오 ssh host zsh -d -f -c \"source /path/to/file\; other command\; ... \".
jayhendren

아니요 ssh가 대화식 쉘과 어떻게 작동하는지 이해합니다. 문제는 달리기가 ssh -t host "zsh -d -f; source /path/to/file나를 대화식 (그리고 불모의) zsh껍질에 빠지게한다는 것 입니다.
hjkatz

1
나는 이것이 왜 그런지 고치는 방법을 이미 말했다. 을 실행 하면 zsh 셸 내에서 ssh -t host "zsh -d -f; source /path/to/file"명령 source...이 실행되지 않습니다. zsh 쉘이 종료 된 후 로그인 쉘에서 실행됩니다. 이것을 테스트하려면을 실행하십시오 ssh host "zsh; echo foo". 당신은 출력 "foo는"가 표시됩니다 당신이 zsh을 쉘에서 종료합니다.
jayhendren

4

ZDOTDIR을 사용하면 선택한 디렉토리에서 zsh호출 .zshrc된 파일을 해석하도록 말할 수 있지만 선택한 파일 (반드시 호출되지는 않음)이 해석 .zshrc하기가 매우 어렵다는 것을 알 수 있습니다.

에서 sh또는 ksh, 에뮬레이션 zsh평가됩니다 $ENV; 그래서 당신은 당신 emulate 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_name수행하는 것처럼 표시 할 수 있습니다 . 또한 매개 변수 확장 플래그 에서도 사용됩니다 . 따라서 하나가 확장 되면 해당 함수가 호출됩니다.proj:x/opt/myproj/proj/xD${(D)somevar}zsh_directory_name

여기, 우리가 사용하고있는 ${(D):-}, ${:-}이라고 ${no_var:-nothing}확장되어 nothing있는 경우 $no_var비어있는, 그래서 ${(D):-}호출하는 동안 아무것도로 확장됩니다 zsh_directory_name. zsh_directory_name이전에 다음과 같이 정의되었습니다.

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

즉, (프롬프트 처음시) 첫 PS1 확장에 따라, ${(D):-}원인이됩니다 promptsubst옵션합니다 (을 취소하는 설정이 해제 -o promptsubst) zsh_directory_name()(우리는 한 번만 실행하려는로) undefined로 $PS1설정이 해제하고, /path/to/file공급한다.

${PS1=%m%# }팽창 (및 양수인 $PS1에) %m%#PS1 이미 (에 의해 인스턴스에 대해 정의하지 않는 한 /path/to/file애프터 unset), 그리고 %m%#발생은 기본 값이 될 수 있습니다 PS1.


이것은 매우 사치스럽게 보이며 가능한 한 빨리 시도해 볼 것입니다. 이것이 효과가 있기를 바랍니다!
hjkatz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.