#bash
#bash
Вопрос:
Допустим, у меня есть скрипт install.sh
. Я хочу поместить команду в начало этого скрипта, которая очистит среду для меня, сохранив только $PATH и $HOME родительской оболочки.
Я знаю, env -i
но для этого требуется второй скрипт, который будет выполнять «env -i install.sh «. Я хочу один install.sh скрипт, который пользователи будут запускать напрямую («sh install.sh » или «./install.sh «).
Комментарии:
1. См . unix.stackexchange.com/a/291913/112235 что должно сработать в вашем случае
2. @Inian похоже, вы не прочитали вопрос. «env -i bash —noprofile —norc <command/script.sh >» выполняет одну команду или внешний скрипт, но я хочу выполнить остальную часть текущего скрипта.
3. Я хотел добавить эту строку в начало вашего
install.sh
скрипта
Ответ №1:
Вы можете повторно выполнить скрипт из него:
[ -z "$CLEANED" ] amp;amp; exec env -i CLEANED=1 "PATH=$PATH" "HOME=$HOME" bash "$0" "$@"
unset CLEANED
Где CLEANED
находится переменная-маркер, сообщающая вашему сценарию, что среда была очищена.
Комментарии:
1. Вы удалили необходимую часть связанного ответа, без которого сценарий будет выполняться дважды: первый раз в чистой среде и второй раз в исходной среде, поскольку выполнение следует за
exec
командой2. @Aaron бесконечно много раз, на самом деле — он будет продолжать перезапускать себя.
3. @Aaron большое спасибо, похоже, вы ответили на мой вопрос.
4. #!/bin/bash exec env -i «PATH= $PATH» «HOME = $HOME» bash «$0» «$@» echo START никогда не печатает START 🙁
5. @ptkvsk это то, о чем говорил Аарон — как и в связанном сообщении, вам нужно добавить проверку:
[ -z "$CLEANED" ] amp;amp; exec env -i CLEANED=1 "PATH=$PATH" "HOME=$HOME" bash "$0" "$@"
— иначе он просто продолжит цикл.
Ответ №2:
Один из способов сделать это — использовать compgen -v
для предоставления списка имен переменных и отмены каждого из них по очереди:
for i in $(compgen -v)
do
case "$i" in
HOME|PATH)
;;
*)
unset "$i"
;;
esac
done
unset i
Обратите внимание, что есть некоторые переменные Bash, которые нельзя отменить:
BASHOPTS
BASH_ARGC
BASH_ARGV
BASH_LINENO
BASH_SOURCE
BASH_VERSINFO
EUID
PIPESTATUS
PPID
SHELLOPTS
UID
_
Комментарии:
1. Если вы попробуете это в интерактивной оболочке, не удивляйтесь, если окажется, что он зависает — это не так, но трудно сказать, когда у вас нет
PS1
.