Установка переменной в bash -c
Я пытаюсь установить переменную, которая получает интерфейс IP-адрес от ifconfig
и прочитайте это позже. Но когда я выполняю echo
команда, переменная еще пуста. Пожалуйста, посмотрите на мой код:
/usr/bin/bash -c "HOST_IPS=$(/usr/bin/ifconfig | /usr/bin/awk 'BEGIN {cnt=0} {if($0 ~ /inet / && cnt==1) {print $2} cnt++}'); echo $HOST_IPS"
Но /bin/echo отлично работает с той же командой:
/usr/bin/bash -c "echo $(/usr/bin/ifconfig | /usr/bin/awk 'BEGIN {cnt=0} {if($0 ~ /inet / && cnt==1) {print $2} cnt++}')"
3 ответа
Вы должны избежать $
войдите в последнюю команду echo или переменную $HOST_IPS
будет подставлен в командную строку до появления подоболочки:
/usr/bin/bash -c "HOST_IPS=$(/usr/bin/ifconfig | /usr/bin/awk 'BEGIN {cnt=0} {if($0 ~ /inet / && cnt==1) {print $2} cnt++}'); echo \$HOST_IPS"
Для более быстрой видимости:
# v-- insert backslash here
/usr/bin/bash -c "HOST_IPS=$(same as before); echo \$HOST_IPS"
Вопреки комментарию @gniourf_gniourf, на самом деле нет необходимости избегать других знаков доллара. Однако, как написано, подстановка команд не выполняется подоболочкой (!); его результат подставляется в командную строку, которая передается в подоболочку. Звонки
mypid() { echo $$; }
bash -c "pid=$(mypid); echo \$pid; mypid"
продемонстрировать, как это работает: однажды он напечатает PID родительской оболочки и однажды пожалуется, что mypid
не известная команда, потому что подоболочка не знает функцию.
С запуском ifconfig | awk
Команда в родительской оболочке вряд ли будет проблемой, вы, вероятно, можете оставить часть подстановки команд без изменений. Если важно, чтобы команда запускалась подоболочкой, вам также придется избегать всех этих вещей.
Исходя из вашего вопроса и примера, ваша задача не требует ухода из текущей среды, поэтому вам не нужно начинать новую и заботиться о потерянных данных.
HOST_IPS=();
while read -r;
do [[ $REPLY =~ "inet "([^/]*) ]] && HOST_IPS+=(${BASH_REMATCH[1]});
done < <( ip -f inet address show )
Если вы хотите сохранить список IP-адресов интерфейса, вы можете обработать вывод ip
(или же ifconfig
) в вашей текущей оболочке без вызова awk
,
С /usr/bin/bash
вы начинаете недоработку. Когда оболочка завершена, все настройки в оболочке теряются.
Следующая подпрограмма устанавливается в подоболочке и теряется перед выводом:
/usr/bin/bash -c sub=1; echo $sub
Если вы хотите установить переменную в подоболочке, используйте stdout для передачи значения:
sub=$(/usr/bin/bash -c "echo 1"); echo $sub