Invoque zsh, depois * source * outro arquivo (ao entrar no modo interativo)

4

Esta questão é obviamente relacionada, mas diferente de aquele sobre executar um comando .

As soluções das perguntas envolvem iniciar um subshell - o que não é possível devido ao requisito de terceirização em vez de executar - ou modificar seu ~/.zshrc , o que não é possível se você quiser distribuir um script que o faça . (Ou melhor, modificar os arquivos de configuração do usuário é algo que você simplesmente não faz)

O problema é que com o zsh não há nenhum parâmetro --init-file como o bash tem (a primeira vez que vi o bash com um recurso que o zsh não tinha)

Eu darei uma resposta com a minha pergunta, mas é muito feio e espero que alguém conheça um truque para contornar isso!

    
por flying sheep 04.05.2013 / 15:40

1 resposta

1

Este site diz-nos que existe um $ZDOTDIR , o que torna possível uma solução muito feia:

  1. /distdir/my-cmd :

    Use maneiras específicas de shell para substituir os arquivos init ou falhar irremediavelmente.

    case $(basename $SHELL) in
        zsh)  OLD_ZDOTDIR="$ZDOTDIR" ZDOTDIR="/distdir" zsh -i ;;
        bash) bash --init-file "/distdir/.zshrc" -i ;;
        *)    echo "Unrecognized shell $SHELL"; exit 1 ;;
    esac
    
  2. /distdir/.zshrc :

    Nomeado .zshrc , pois os nomes são codificados em zsh, mas o bash pode ser passado por um arquivo nomeado arbitrariamente via --init-file . Também seria possível nomear isto, e. our_stuff.sh e crie um .zshrc que contenha apenas . ./our_stuff.sh .

    Como, na verdade, não queremos substituir os arquivos init, mas para acrescentar outro, precisamos recriar meticulosamente a sequência incorporada de origem deles.

    # ignore profile, login & logout rc files, as we want no login shells
    case $(basename $SHELL) in
        zsh)
            test -f "$OLD_ZDOTDIR/.zshenv" && . "$OLD_ZDOTDIR/.zshenv"
            test -f "$OLD_ZDOTDIR/.zshrc"  && . "$OLD_ZDOTDIR/.zshrc"
            ;;
        bash)
            test -f ~/.bashrc        && source ~/.bashrc
            test -f /etc/bash.bashrc && source /etc/bash.bashrc
            ;;
    esac
    
    do_our_stuff!
    
    PS1="myenv! $PS1" #tell the user he’s in a modified shell
    
por 04.05.2013 / 15:40