In der Shell gesetzte Variablen werden bei "bash -c 'command'" nicht gelesen

In der Shell gesetzte Variablen werden bei "bash -c 'command'" nicht gelesen

Eingang:

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

Ausgabe:

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

Eingang:

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

Ausgabe:

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

Anstatt:

/media/riccardo/rootfs/etc/profile

Wie kann ich das Problem lösen?

Antwort1

Shell-Variablen werden standardmäßig nicht in Befehle exportiert, die von der Shell gestartet werden.

Sie müssen dies explizit tun export, zum Beispiel:

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

Außer dass sudomöglicherweise noch die Umgebung bereinigt wird, bevor es an übergeben wird bash, sodass Sie stattdessen möglicherweise die Befehlszeilenargumente verwenden müssen:

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

exportDies ist hier nicht erforderlich . sudo_bashEs handelt sich lediglich um eine Zeichenfolge, die als „Name“ dieser inneren Shell verwendet wird. Sie würden dies sehen, wenn die -cZeichenfolge beispielsweise einen Syntaxfehler hätte.

Siehe auch:

Antwort2

Zitierprobleme

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

''Anführungszeichen sind wörtlich zu verstehen und ""ermöglichen die Erweiterung von Variablen. Ich habe beides verwendet und sie miteinander verkettet. Es würde auch funktionieren, wenn ich nur verwendet hätte "".

verwandte Informationen