Variáveis ​​definidas no shell não são lidas em "bash -c 'command'"

Variáveis ​​definidas no shell não são lidas em "bash -c 'command'"

Entrada:

sudo bash -c '>> /media/$USER/rootfs/etc/profile'

Saída:

bash: /media/root/rootfs/etc/profile: No such file or directory

Entrada:

TEST=$USER
sudo bash -c '>> /media/$TEST/rootfs/etc/profile'

Saída:

bash: /media//rootfs/etc/profile: No such file or directory

Em vez de:

/media/riccardo/rootfs/etc/profile

Como posso resolver o problema?

Responder1

As variáveis ​​do shell não são exportadas para comandos iniciados no shell, por padrão.

Você precisa fazer isso explicitamente com export, por exemplo:

$ export test=foo
$ bash -c 'echo test=$test'
test=foo

Exceto que isso sudoainda pode limpar o ambiente antes de passá-lo para bash, então você pode precisar usar os argumentos da linha de comando:

$ test=foobar 
$ sudo bash -c 'echo "$1"' sudo_bash "$test"
foobar

Não há necessidade exportaqui, e sudo_bashé apenas uma string usada como o "nome" desse shell interno, você veria se a -cstring tivesse, por exemplo, um erro de sintaxe.

Veja também:

Responder2

Citando problemas

sudo bash -c '>> /media/'"$USER"'/rootfs/etc/profile'
test=$USER
sudo bash -c '>> /media/'"$test"'/rootfs/etc/profile'

''aspas são literais, ""as aspas permitem a expansão de variáveis. Eu usei os dois, concatenando-os juntos. Também funcionaria se eu usasse apenas "".

informação relacionada