Inicie o zsh com um zshrc personalizado

12

Eu quero poder iniciar o zsh com um arquivo rc personalizado semelhante ao comando: bash --rc-file /path/to/file

Se isso não for possível, será possível iniciar o zsh, executar source /path/to/file e permanecer na mesma sessão zsh?

Nota: O comando zsh --rcs /path/to/file não funciona, pelo menos não para mim ...

EDIT: na sua totalidade, eu quero ser capaz de fazer o seguinte: ssh para um servidor remoto "example.com", execute zsh , source minha configuração localizada em /path/to/file , all in 1 command. É aqui que tenho lutado, especialmente porque prefiro não escrever sobre nenhum arquivo de configuração na máquina remota.

    
por hjkatz 23.05.2014 / 21:09

2 respostas

12

Nas páginas man:

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.

então você deve ser capaz de definir a variável de ambiente ZDOTDIR para um novo diretório para que o zsh procure por um conjunto diferente de dotfiles.

Como a página man sugere, RCS e GLOBAL_RCS não são caminhos para arquivos rc, já que você está tentando usá-los, mas sim opções que podem ser ativadas ou desativadas. Portanto, por exemplo, o sinalizador --rcs ativará a opção RCS , fazendo com que o zsh seja lido a partir de arquivos rc. Você pode usar os seguintes sinalizadores de linha de comando para zsh para habilitar ou desabilitar RCS ou GLOBAL_RCS :

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

Para responder à sua outra pergunta:

is it possible to start zsh, run "source /path/to/file", then stay in the same zsh session?

Sim, isso é muito fácil de acordo com as instruções acima. Basta executar zsh -d -f e, em seguida, source /path/to/zshrc .

    
por 23.05.2014 / 21:18
4

enquanto estiver com ZDOTDIR, você pode dizer a zsh para interpretar um arquivo chamado .zshrc em qualquer diretório de sua escolha, interpretando qualquer arquivo de sua escolha (não necessariamente chamado .zshrc ) prova ser bastante difícil. p>

Em sh ou ksh emulação, zsh avalia $ENV ; então você pode adicionar emulate zsh no topo do seu /path/to/file e fazer:

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

Outra abordagem muito complicada poderia ser:

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

Essa merece uma explicação.

${foo::=value} é uma expansão variável que, na verdade, define $foo . $functions é uma matriz associativa especial que mapeia para nomes de funções e suas definições.

Com a opção promptsubst , as variáveis em $PS1 são expandidas. Assim, no primeiro prompt, as variáveis nesse PS1 serão expandidas.

A função zsh_directory_name é uma função especial que ajuda a expandir o ~foo para /path/to/something e o inverso. Isso é usado, por exemplo, com %~ no prompt para que, se o diretório atual for /opt/myproj/proj/x , você possa exibi-lo como ~proj:x com zsh_directory_name fazendo o mapeamento proj:x < = > %código%. Isso também é usado pelo sinalizador de expansão /opt/myproj/proj/x . Portanto, se alguém expandir D , essa função ${(D)somevar} será chamada.

Aqui, usamos zsh_directory_name , ${(D):-} , que é ${:-} expandido para ${no_var:-nothing} se nothing estiver vazio, então $no_var se expande para nada enquanto chama ${(D):-} . zsh_directory_name foi definido anteriormente como:

zsh_directory_name() {
  unsetopt promptsubst
  unfunction zsh_directory_name
  unset PS1; . /path/to/file
}

Ou seja, na primeira expansão do PS1 (no primeiro prompt), zsh_directory_name fará com que a opção ${(D):-} seja cancelada (para cancelar o promptsubst ), -o promptsubst seja indefinida (como queremos para executá-lo apenas uma vez) zsh_directory_name() a ser não definido e $PS1 a ser originado.

/path/to/file expande (e atribui ${PS1=%m%# } ) para $PS1 , a menos que PS1 já tenha sido definido (por exemplo, %m%# após o /path/to/file ) e unset seja o valor padrão de %m%# .

    
por 23.05.2014 / 23:26