다음 명령과 유사한 사용자 정의 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가 다른 도트 파일 세트를 찾을 수 있도록 환경 변수를 새 디렉토리로 설정할 수 있어야 합니다 .
매뉴얼 페이지에 나와 있듯이 RCS
은 GLOBAL_RCS
rc 파일에 대한 경로가 아니지만(사용하려고 할 때) 옵션을 활성화하거나 비활성화할 수 있습니다. 예를 들어, 이 플래그는 zsh가 rc 파일에서 읽도록 하는 옵션을 --rcs
활성화합니다 . RCS
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
.
답변2
zsh
ZDOTDIR을 사용하면 귀하가 선택한 모든 디렉토리에서 해석이 파일로 호출되도록 지시할 수 있지만 .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:x
zsh_directory_name
proj:x
/opt/myproj/proj/x
D
${(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()
$PS1
/path/to/file
${PS1=%m%# }
PS1이 정의되지 않은 경우(예: after ) 를 확장(및 할당 $PS1
) 하며 이는 기본값이 됩니다 .%m%#
/path/to/file
unset
%m%#
PS1