Configurando caminhos para C-shell interativo

3

Meu shell padrão (no Ubuntu) é bash. No entanto, para um programa específico, eu preciso mudar para o C-shell. Para isso eu tenho um arquivo .cshrc configurado, no entanto, se eu mudar interativamente para o C-shell (estou usando o comando tcsh para isso), noto que todos os caminhos bash são importados.

Existe uma maneira de parar a importação desses caminhos, pois alguns deles são incompatíveis com o programa que preciso executar. ou seja, quando estou no ambiente C-shell, gostaria de poder definir tudo o que preciso no arquivo .cshrc para que eu possa controlar isso. No entanto, não quero alterar meu shell de login permanentemente.

    
por 218 17.10.2017 / 18:04

2 respostas

4

As variáveis de ambiente são sempre herdadas do processo pai [†], portanto, o .cshrc precisará definir ou remover manualmente quaisquer variáveis de ambiente indesejadas

setenv PATH /bin:/other/dirs/here:/and/more
unsetenv PS1

Note que estas são operações exclusivas (para as quais o inglês "ou" infelizmente não possui especificidade booleana). setenv PATH define a variável de ambiente PATH e, em vez disso, unsetenv PS1 remove o ambiente PS1 indesejado. Fazer unsetenv PATH e, em seguida, setenv PATH ... apenas desperdiçariam ciclos da CPU. Em vez disso, simplesmente defina PATH para o que você deseja que seja. (Editar PATH é uma tarefa muito mais complicada e exigirá divisão em : e, em seguida, aplicar código para cada elemento de diretório e assim por diante ... por que todo esse problema? Defina PATH para o que ele precisa ser.)

Ou pode-se usar env -i csh para eliminar totalmente o ambiente, caso em que .cshrc deve definir melhor tudo que é necessário (várias variáveis de ambiente essenciais são definidas por login(1) ou equivalentes, como HOME e assim por diante):

$ env perl -E 'say $ENV{SHELL}'  
/opt/local/bin/mksh
$ env -i perl -E 'say $ENV{SHELL}'

$ 

[†] Bourne shells complicam isso colocando variáveis somente shell como PS1 no mesmo namespace que o resto e então tendo um booleano (via export ) que sinaliza aquelas que são repassadas via extern char **environ aos processos filhos; veja as páginas environ(7) e execve(2) man para mais detalhes sobre o que está acontecendo sem a complicação do shell.

    
por 17.10.2017 / 19:12
0

Is there a way to stop importing these paths

Se você estiver editando .cshrc ou .tcshrc mesmo assim, pode preferir permitir as variáveis de ambiente você não quer, ou cujos valores você deseja alterar, para ser passado para tcsh . Em seguida, desative-os ou modifique seus valores. Isso é o que excelente resposta do thrig explica como fazer.

No entanto, você pode fazer exatamente o que pediu: execute tcsh sem as variáveis de ambiente que não deseja ou forneça valores diferentes.

Se você estiver executando tcsh de um shell estilo Bourne como bash então você pode escrever VAR=val pares antes do comando para definir variáveis de ambiente para esse comando. Por exemplo:

PATH=/sbin:/bin:/usr/sbin:/usr/bin tcsh

Isto não é o mesmo que emitir a atribuição como um comando separado (seguindo-a com uma nova linha ou com um caractere ; ). Se você fez isso, não exportaria a variável para o ambiente de subprocessos como tcsh , e a tarefa permaneceria mesmo depois que o próximo comando foi executado.

Você também pode definir várias variáveis de ambiente dessa maneira:

BAR=barval PATH=/sbin:/bin:/usr/sbin:/usr/bin tcsh

Observe que a variável de ambiente permanece inalterada para comandos subsequentes executados em bash :

ek@Io:~$ echo "$LANG"
en_US.UTF-8
ek@Io:~$ LANG=C tcsh -c 'echo "$LANG"'
C
ek@Io:~$ echo "$LANG"
en_US.UTF-8

Você pode atribuir a string vazia a uma variável de ambiente da mesma maneira:

FOO= tcsh

No entanto, isso não é o mesmo que remover a variável inteiramente do ambiente. Para fazer isso, você pode usar o comando env com o -u option:

env -u FOO tcsh

Você também pode definir variáveis de ambiente com env :

env PATH=/sbin:/bin:/usr/sbin:/usr/bin tcsh

Você geralmente não precisa para fazer isso a partir de bash , já que bash suporta a sintaxe VAR=val .

Você pode definir várias variáveis de ambiente com env e também variáveis não definidas, tudo em um único comando. Isso quer dizer que você não precisa encadear os comandos env . Por exemplo, você pode usar:

env -u FOO BAR=barval PATH=/sbin:/bin:/usr/sbin:/usr/bin tcsh

O comando real env runs começa com seu primeiro argumento de não-opção que não contém nenhum sinal = .

    
por 17.10.2017 / 21:54

Tags