hottabxp
@hottabxp
Сначала мы жили бедно, а потом нас обокрали..

Как «распаковать» параметры из переменной в bash-скрипте?

Есть простой скрипт для отображения размера домашней директории, исключая некоторые директории:
du -sh ~ --exclude=$HOME/{.cache,.config/google-chrome,Загрузки}

Так работает. Но если исключающие директории добавить в переменную (для удобного редактирования списка в дальнейшем), то не работает:
excludes=".cache,.config/google-chrome,Загрузки"
du -sh ~ --exclude=$HOME/{$excludes}

Перелопатил много сайтов, но так решения и не нашел. Также пробовал менять кавычки, убирать их - никакого результата это не принесло.
Вот что показывает отладчик bash:
sergey@sergey-X55A:~$ bash -x ./t.sh 
+ excludes=.cache,.config/google-chrome,Загрузки
+ du -sh /home/sergey '--exclude=/home/sergey/{.cache,.config/google-chrome,Загрузки}'
2,2G	/home/sergey
  • Вопрос задан
  • 146 просмотров
Решения вопроса 4
@xibir
В вашем случае будет работать так:
excludes=".cache,.config/google-chrome,Загрузки"
eval du -sh ~ --exclude=$HOME/{$excludes}
Ответ написан
Комментировать
saboteur_kiev
@saboteur_kiev Куратор тега Linux
software engineer
Юзай eval, он раскроет все переменные и выполнит команду.

$ excludes=".cache,.config/google-chrome,Загрузки"
$ eval echo -sh ~ --exclude=$HOME/{$excludes}
-sh /home/saboteur --exclude=/home/saboteur/.cache --exclude=/home/saboteur/.config/google-chrome --exclude=/home/saboteur/Загрузки
Ответ написан
DevMan
@DevMan Куратор тега Linux
это же классика.
по тупому и практическому: разбор excludes по разделителю, и добавление к home.
по умному : игра в глобинг.
первое выигрывает.
Ответ написан
Комментировать
jcmvbkbc
@jcmvbkbc
http://dilbert.com/strip/1998-08-24
Так происходит, потому что подстановки в bash нерекурсивные. Т.е. если результат подстановки создаёт новую конструкцию, с которой произошла бы подстановка, будь она записана в исходном тексте скрипта, bash не будет её интерпретировать. Это ограничение можно обойти с помощью функции eval, которая интерпретирует свой параметр по всем правилам bash. Т.е. пример из вопроса можно записать так:
du -sh ~ --exclude=$(eval echo $HOME/{$excludes})
Оборотная сторона такого решения -- $excludes становится частью скрипта, и если он контролируется извне, туда легко можно всунуть rm -rf /* как побочный эффект.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
shambler81
@shambler81 Куратор тега Linux
ncdu посмотри, это типа htop только для du
ncdu.png
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы