Conchas diferentes para trabalhos interativos e não interativos

1

Devido a restrições no meu local de trabalho, o shell padrão de cada usuário é tcsh , e é necessário usar tcsh como meu shell não interativo (ou seja, fazemos a maior parte da configuração do ambiente em projetos em tcsh arquivos init). No entanto, gosto de usar zsh como meu shell interativo.

Para herdar o ambiente de tcsh quando mudo para zsh , geralmente inicio primeiro um shell interativo em tcsh e depois alterno para zsh com exec zsh . Isso parece estar funcionando bem.

No entanto, às vezes, atualizamos nossos arquivos tcsh init e eu preciso atualizar meu ambiente de acordo de um shell zsh em execução. Acredito que a melhor maneira de abordar este problema é mudar para tcsh para obter seus arquivos init e depois voltar para zsh .

Na prática, recorro ao seguinte

> # Running from a zsh interactive shell. 
> # Various tcsh and zsh init files have been updated
> exec tcsh
> exec zsh
> # I am back to zsh with the updated environment

Mas estou me perguntando várias coisas:

  1. Existe uma maneira de entrar em colapso

    > exec tcsh
    > exec zsh
    

    em um comando? Eu tentei com:

    > exec tcsh; zsh
    > exec tcsh; exec zsh
    

    mas nenhum deles parece funcionar. O único que parece funcionar é

    > exec tcsh & exec zsh
    

    mas não tenho certeza de que esteja fazendo o que preciso.

  2. Quais são as outras formas de reiniciar totalmente meu shell interativo durante a renovação de meu ambiente não interativo (ou seja, como se eu estivesse efetuando login novamente em tcsh e depois mudando para zsh)

  3. Em geral, qual é a prática recomendada para usar diferentes shells para trabalhos interativos e não interativos e garantir que o shell interativo inicie com o ambiente do shell não interativo ? (com a possibilidade de modificar bits deste ambiente nos arquivos init do shell interativo)

por Amelio Vazquez-Reina 13.03.2013 / 15:44

2 respostas

2

Você pode recolher seus 2 comandos exec em um único comando como:

exec tcsh -c zsh

Você pode atualizar o ambiente em seu processo zsh atual usando:

eval $(env -i tcsh -c env)

Usar env -i faria com que o seguinte comando fosse executado com um ambiente vazio. Isso executa o tcsh para processar os arquivos de inicialização. A opção -c para tcsh executa outra cópia de env , mas desta vez sem um comando, apenas imprime o conteúdo atual do ambiente definido pelo tcsh. Em seguida, o eval $(...) faz com que o zsh analise essa saída.

No meu teste, o uso de env -i é necessário para evitar que o zsh tente definir variáveis de ambiente que foram definidas por ele mesmo, incluindo a variável _ , que é somente leitura. Essa tentativa fez com que o eval falhasse sem processar pelo menos parte da saída.

    
por 13.03.2013 / 16:25
0

Eu assumo que o shell não interativo é usado para execução de scripts.

A maneira mais fácil de expressar que um script precisa de um intérprete especial é usar o shebang , por exemplo, como primeira linha do seu script:

#!/usr/bin/tcsh
    
por 13.03.2013 / 15:53

Tags