Eu posso reproduzir a mesma saída do tcsh:
env -u PATH which ls
which: no ls in ((null))
Em csh e tcsh, há uma distinção entre variáveis de ambiente (que são comuns a todos os processos) e variáveis de shell (que são locais para a invocação atual do shell). Ele usa a mesma sintaxe para se referir a ambos, por exemplo, $PATH
. Se você tiver uma variável shell e uma variável de ambiente com o mesmo nome, então $PATH
refere-se à variável shell.
[t] csh usa uma sintaxe diferente para definir shell vs. variáveis de ambiente:
set shell_var = foo
setenv env_var bar
(shells baseados em Bourne, como o bash, têm uma sintaxe diferente e uma terminologia diferente; uma variável de ambiente é uma variável do shell que foi "exportada" ou herdada do processo de chamada).
Com base nos sintomas que você descreve, você tem uma variável de shell $PATH
(que é inútil), mas nenhuma variável de ambiente com o mesmo nome. Isso normalmente não deveria acontecer. Verifique seus arquivos .cshrc
, .tcshrc
e / ou .login
para instruções que definem $PATH
.
Você deve conseguir contornar o problema imediato como este:
setenv PATH "$PATH" # set the environment variable
unset PATH # unset the shell variable, just to avoid confusion
(Não faça o unset PATH
até confirmar que as coisas estão funcionando corretamente.)
Só para aumentar a frivolidade, [t] csh tem uma variável especial shell $path
(nota minúscula); seu valor é uma matriz que consiste nos componentes separados por :
da variável de ambiente $PATH
. A configuração atualizará automaticamente a outra:
setenv PATH /usr/bin:/bin # sets $path to ( /usr/bin /bin )
set path = ( /usr/local/bin $path ) # sets $PATH to '/usr/local/bin:/usr/bin:/bin'
Isso pode ser conveniente, mas se você preferir, pode ignorar $path
e lidar com $PATH
. Apenas certifique-se de que você está configurando a variável de ambiente $PATH
(usando setenv
), não a variável de shell inútil do mesmo nome.