Primeira pergunta : variável $ PATH é construída no login do número de arquivos e a saída que você vê quando faz echo $PATH
é o resultado do resultado mesclado (mantido na memória).
Para encontrar em qual arquivo a variável PATH foi definida (provavelmente ela estará em vários arquivos), você terá que considerar os arquivos que são lidos ao fazer o login. A lista abaixo pode variar um pouco de uma distribuição para outra, mas deve ser um bom ponto de partida.
/etc/profile, /etc/profile.d/*, /etc/bashrc, /etc/environment, ~/.bashrc, ~/.bash_profile, ~/.bash_login, ~/.profile.
Segunda pergunta respondida Como observado acima, as variáveis são mantidas na memória, você pode modificar e adicionar novas como desejar. Por exemplo, para adicionar ao PATH já definido:
[root@re ~]# PATH=$PATH:/opt/some/path
[root@re ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt/some/path
O acima é válido apenas para a sessão atual. Para torná-lo permanente, precisarei adicioná-lo a um dos arquivos que estão sendo fornecidos durante o login.
Digamos que eu queira adicionar JAVA_HOME e também garantir que o arquivo binário java esteja na variável de caminho do sistema. Vou criar um novo arquivo chamado /etc/profile.d/my-java-env.sh com o seguinte conteúdo.
[root@re ~]# cat /etc/profile.d/my-java-env.sh
# Here we are adding java bin folder to existing path.
PATH=$PATH:/usr/java/jdk1.8.0_20/bin
# Here we are creating new variable pointing to JAVA_HOME
JAVA_HOME=/usr/java/jdk1.8.0_20
Para o acima, tornar-se efetivo login novamente.
$ CDPATH Por padrão nas distros com as quais trabalho (Ubuntu, CentOS) a variável está vazia (não definida), mas a mesma lógica se aplica, se estiver definida, isso provavelmente foi feito em um dos arquivos fornecidos durante o login (conforme explicado acima).