Tenho a impressão de que suas perguntas subseqüentes derivam de sua pergunta inicial (mas não posso dizer, não é fácil ler a linha de pensamento)
The relevant part is this:
mkdir -p $mount_point/root/bin && \ cp chroot-env-setup.sh $mount_point/root/bin/ && \ chroot $mount_point bash -c /root/bin/chroot-env-setup.sh && \ chroot $mount_point
A partir desse trecho, acho que você quer executar um script no ambiente chroot que faz a configuração inicial e, em seguida, insira o ambiente chroot com uma linha de comando interativa.
So I've passed in the
chroot-env-setup.sh
script. It runs and declares some stuff, the problem point being:export HOME=/root export PATH=$PATH:/root/bin ## *** More functions... ## *** Calls to other scripts... exit 0;
Você não esclareceu, mas presumo que isso represente o conteúdo do script do construtor de sessão?
Se sim, export VARNAME=value
só se aplica à sessão ou script do shell em que é executada, e não à sessão que o chama.
A palavra-chave export
permite que os processos filhos herdam a variável, caso contrário, ela permanece estritamente no escopo da sessão / shell script em execução. As variáveis de ambiente NUNCA se aproximam do ambiente do chamador. Isso seria uma questão operacional catastrófica, para não mencionar um campo minado de segurança.
Com relação a onde colocar sua definição de variável:
Todos os usuários podem ter um arquivo ~/.bashrc
e ~/.profile
, mesmo root
, root
é de fato um usuário, ele só tem privilégios especiais e uma pasta pessoal em outro lugar.
Sua sessão bash começa no entanto com qualquer que seja o HOME
atualmente definido. Ao chamar chroot
, você precisa fornecer o destino pretendido HOME
- adicione
export PATH=$PATH:/root/bin
a$mountpoint/root/.bashrc
- talvez também adicione
echo Welcome to the chroot environment
ao mesmo.bashrc
para ver se funciona
- talvez também adicione
- ao chamar o chroot, você precisa especificar a pasta inicial - não de dentro do chroot:
-
HOME=/root chroot $mountpoint
-
De fato, você especifica uma variável e chama um comando na mesma linha. Isso define a variável para o ambiente desse comando, não o ambiente atual em execução.
Para demonstração, tente
# Set var in current environment
MY_IS_SET=no
# Set var before calling env, which prints what its environment contains
MY_IS_SET=yes env | grep MY_IS_SET
# Check that current original environment is unchanged
echo $MY_IS_SET
As respostas para o resto das suas perguntas devem fluir daí?