Невозможно построить команду из вывода ps

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, в качестве трамплина.

0
05.09.2020, 11:27
2 ответа

Предполагая, что ps -eo cmdделает то, что вы хотите, кажется, что вам нужно:

"$(ps -eo cmd | awk 'sub("/[h]ttpd[^/]*$",""){print; exit}')"/apachectl -v
1
18.03.2021, 23:07

Вы можете запустить его в одну строку, например

PS_OUTPUT=`dirname $(ps -eo cmd | grep [h]ttpd | head -1|awk '{print $1}')`; APACHE='apachectl -v'; myCMD='$OUTPUT/$APACHE'; eval $myCMD

eval:выполняет аргумент как команду оболочки

1
18.03.2021, 23:07

Теги

Похожие вопросы