unset SOME_VARIABLE
удаляет SOME_VARIABLE
из окружения. Это все, что вам нужно почти во всех случаях. В редком случае, когда этого недостаточно, вы не можете избежать вызова промежуточного процесса (, но это может быть еще один экземплярsh
).
Вызов export
, а затем unset -v
не имеет никакого преимущества. Бессмысленно экспортировать переменную, если вы собираетесь потом ее сбросить.Функции не хранятся в среде, поэтому unset -v
не влияет на то, что будут видеть подпроцессы.
Некоторые оболочки экспортируют функции через среду, но они делают это путем кодирования определения функции как определения переменной. Если переменная имеет то же имя, что и функция, то unset FUNCTION_NAME
позаботится об этом, а если нет, то unset -v FUNCTION_NAME
не делает ничего, кроме того, что делает unset FUNCTION_NAME
.
Крайним случаем, когда вы не можете сбросить значение переменной, является ситуация, когда она объявлена только для чтения -. Не существует переносимого способа вернуть переменную из режима чтения -только в обычный режим. Чтобы перенести переменную только для чтения -из среды, вы должны вызвать другую копию оболочки :
.readonly foo=bar
export foo
sh -c 'unset foo; exec some-command'
Другим пограничным случаем является несколько переменных, которые некоторые оболочки настаивают на определении и молча предотвращают их сброс. Чтобы удалить их из среды, вы должны использовать другую оболочку или утилиту, например env
, в качестве трамплина.
Предполагая, что ps -eo cmd
делает то, что вы хотите, кажется, что вам нужно:
"$(ps -eo cmd | awk 'sub("/[h]ttpd[^/]*$",""){print; exit}')"/apachectl -v
Вы можете запустить его в одну строку, например
PS_OUTPUT=`dirname $(ps -eo cmd | grep [h]ttpd | head -1|awk '{print $1}')`; APACHE='apachectl -v'; myCMD='$OUTPUT/$APACHE'; eval $myCMD
eval
:выполняет аргумент как команду оболочки