Sono interessato a impostare le variabili ambientali di un'istanza shell da un'altra. Quindi ho deciso di fare qualche ricerca. Dopo aver letto un certo numero di domande circa questo ho deciso di provarlo.
Ho generato due gusci A e B (PID 420), entrambi in esecuzione zsh
. Dalla shell AI è stato eseguito il seguente.
sudo gdb -p 420
(gdb) call setenv("FOO", "bar", 1)
(gdb) detach
Dalla shell B quando corro env
vedo che la variabile FOO è effettivamente impostata con un valore di bar. Questo mi fa pensare che FOO sia stato inizializzato con successo nell'ambiente della shell B. Tuttavia, se provo a stampare FOO, ottengo una riga vuota che implica che non è impostata. Per me, sembra che ci sia una contraddizione qui.
Questo è stato testato sia sul mio sistema Arch GNU / Linux che su una macchina virtuale Ubuntu. Ho anche testato questo in bash
cui la variabile non si presentava nemmeno in env. Questo, sebbene deludente per me, ha senso se la shell memorizza nella cache una copia del suo ambiente al momento della generazione e la utilizza solo (come suggerito in una delle domande collegate). Questo non risponde ancora perché zsh
può vedere la variabile.
Perché l'output è echo $FOO
vuoto?
MODIFICARE
Dopo l'input nei commenti ho deciso di fare un po 'più di test. I risultati possono essere visualizzati nelle tabelle seguenti. Nella prima colonna è la shell in cui è FOO
stata iniettata la variabile. La prima riga contiene il comando il cui output è visibile sotto di esso. La variabile FOO
è stato iniettato utilizzando: sudo gdb -p 420 -batch -ex 'call setenv("FOO", "bar", 1)'
. I comandi specifici di zsh: zsh -c '...'
sono stati testati anche usando bash. I risultati erano identici, la loro produzione è stata omessa per brevità.
Arch GNU / Linux, zsh 5.3.1, bash 4.4.12 (1)
| | env | grep FOO | echo $FOO | zsh -c 'env | grep FOO' | zsh -c 'echo $FOO' | After export FOO |
|------|------------------|-----------|---------------------------|----------------------|-----------------------------------|
| zsh | FOO=bar | | FOO=bar | bar | No Change |
| bash | | bar | | | Value of FOO visible in all tests |
Ubuntu 16.04.2 LTS, zsh 5.1.1, bash 4.3.48 (1)
| | env | grep FOO | echo $FOO | zsh -c 'env | grep FOO' | zsh -c 'echo $FOO' | After export FOO |
|------|------------------|-----------|---------------------------|----------------------|-----------------------------------|
| zsh | FOO=bar | | FOO=bar | bar | No Change |
| bash | | bar | | | Value of FOO visible in all tests |
Quanto sopra sembra implicare che i risultati sono agnostici di distribuzione. Questo non mi dice molto di più zsh
e bash
gestisce l'impostazione delle variabili in modo diverso. Inoltre, export FOO
ha un comportamento molto diverso in questo contesto a seconda della shell. Speriamo che questi test possano chiarire qualcosa a qualcun altro.
env
) vedono l'ambiente modificato.
zsh
in GDB non la renda visibile come variabile di shell ma la faccia passare ai processi figlio (come hai osservato), mentre impostarne uno per bash
lo rende visibile come variabile di shell ma non lo fa passare ai processi figlio! Sembra che zsh e bash utilizzino strategie diverse per la gestione delle variabili, con zsh che tiene traccia delle variabili non ambientali e che bash memorizza tutto nel suo ambiente che sanifica quando avvia un figlio (non subshell).
export FOO
in bash
?
zsh -c 'echo $FOO'
(utilizzare virgolette singole!) Invece? Riesci a vederlo allora?