Como alterar shells via script?

2

Tenho que repetir a seguinte operação muitas vezes, por isso quero automatizá-la.

sudo su
tcsh
cd $workDir

Aqui $workDir está definido em ~/.tcshrc . Eu tentei escrever dois scripts de shells. Script1 é temp.sh

#!/bin/bash
sudo su
./temp.csh

Script2 é temp.csh

#!/usr/bin/tcsh
tcsh
cd $workDir

Mas isso não funciona como esperado, ou seja, não vejo o prompt do cshell (ainda no prompt do bash, ao contrário da abordagem sem script), nem gravei CDD no $ workDir. Qualquer ajuda / ponteiros?

    
por user13107 23.10.2012 / 04:23

3 respostas

1

Use workDir="/dev/"; sudo su -c tcsh -c "cd $workDir; echo \$PWD" para alterar a pasta durante o script.

Lembre-se de escapar de todos os $ .

EDITAR

Por que você não faria isso:

sudo ./tcsh.csh

E dentro de tcsh.csh contém:

#!/usr/bin/tcsh
cd $workDir  # need to set $workDir somewhere, depends on you
blabla
    
por 23.10.2012 / 04:29
0

Você pode fazer algo parecido com isso de (usando aqui-doc ):

tcsh<<EOF
command1
command2
(...)
EOF
    
por 23.10.2012 / 04:31
0

Quando você corre

sudo su
./temp.csh

isto executa um shell interativo como root ( sudo su ), então quando esse shell termina o script csh é executado. Da mesma forma, o script temp.csh primeiro executa um tcsh interativo e, em seguida, altera seu diretório atual antes de sair.

Para executar um script csh como root, execute

sudo ./temp.csh

Para executar uma instância interativa do tcsh como root, o que eu acho que é o que você está tentando fazer, execute

sudo tcsh

Para executar essa instância do tcsh em um diretório específico, altere o diretório antes de executar o sudo.

cd /path/to/directory && sudo tcsh

Observe que, em muitas instalações, sudo limpa a maior parte do ambiente, portanto, não espere que as variáveis de ambiente definidas no script do wrapper estejam disponíveis na sessão tcsh.

Você não pode passar um script para executar no início de uma sessão tcsh, além dos arquivos de perfil ( /etc/csh.login e ~/.login para os shells de login, /etc/csh.cshrc e ~/.cshrc para todas as instâncias de tcsh). Se você quiser executar alguns comandos iniciais, coloque-os em ~/.cshrc (possivelmente dentro de uma construção condicional). Como alternativa, para comandos que executam apenas programas, defina variáveis de ambiente, altere o diretório atual e semelhantes, é possível usar um script de wrapper como o abaixo; isso não funciona para alterar o ambiente shell (por exemplo, para definir variáveis csh com set ).

#!/bin/tcsh
# commands go here
cd $workdir
setenv foo bar
exec tcsh
    
por 24.10.2012 / 02:30

Tags