Переменные, установленные в оболочке, не считываются с помощью "bash -c 'command'"

Переменные, установленные в оболочке, не считываются с помощью "bash -c 'command'"

Вход:

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

Выход:

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

Вход:

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

Выход:

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

Вместо:

/media/riccardo/rootfs/etc/profile

Как решить эту проблему?

решение1

По умолчанию переменные оболочки не экспортируются в команды, запускаемые из оболочки.

Вам нужно явно сделать это с помощью export, например:

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

За исключением того, что это sudoвсе равно может очистить среду перед передачей ее в bash, поэтому вам может потребоваться вместо этого использовать аргументы командной строки:

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

Здесь в этом нет необходимости export, sudo_bashэто просто строка, которая используется как «имя» этой внутренней оболочки, вы бы увидели это, если бы строка -cсодержала, например, синтаксическую ошибку.

Смотрите также:

решение2

Проблемы с цитированием

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

''Кавычки — это литералы, ""кавычки позволяют расширять переменные. Я использовал оба, объединяя их вместе. Это также сработало бы, если бы я использовал только "".

Связанный контент