Допустим, у меня есть сценарий install.sh.
Я хочу поместить в начало этого скрипта команду, которая очистит для меня среду, сохранив только $PATH и $HOME родительской оболочки.
Я знаю о env -i, но для этого требуется второй скрипт, который сделает "env -i install.sh". Мне нужен один скрипт install.sh, который пользователи будут запускать напрямую ("sh install.sh" или "./install.sh").
@Inian кажется, ты не читал вопрос. "env -i bash --noprofile --norc <command/script.sh>" выполняет одну команду или внешний скрипт, но я хочу выполнить остальную часть текущего скрипта.
Я хотел добавить эту строку в начало вашего скрипта install.sh.





Вы можете повторно выполнить скрипт из него:
[ -z "$CLEANED" ] && exec env -i CLEANED=1 "PATH=$PATH" "HOME=$HOME" bash "$0" "$@"
unset CLEANED
Где CLEANED — это маркерная переменная, сообщающая вашему скрипту, что среда очищена.
Вы удалили необходимую часть связанного ответа, без которой скрипт будет выполняться дважды, первый раз с чистой средой и второй раз с исходной средой, поскольку выполнение следует за командой exec
@Aaron, на самом деле, бесконечно много раз - он будет повторять себя.
@ Аарон, большое спасибо, кажется, ты ответил на мой вопрос.
#!/bin/bash exec env -i "PATH=$PATH" "HOME=$HOME" bash "$0" "$@" echo START никогда не печатает START :(
@ptkvsk это то, о чем говорил Аарон - как и в связанном посте, вам нужно добавить проверку: [ -z "$CLEANED" ] && exec env -i CLEANED=1 "PATH=$PATH" "HOME=$HOME" bash "$0" "$@" - иначе он просто будет продолжать зацикливаться.
Хорошо, понятно... Думаю, имеет смысл перенести это в ответ. Спасибо!
Один из способов сделать это — использовать compgen -v, чтобы указать список имен переменных и отключить каждую из них по очереди:
for i in $(compgen -v)
do
case "$i" in
HOME|PATH)
;;
*)
unset "$i"
;;
esac
done
unset i
Обратите внимание, что есть некоторые переменные Bash, которые нельзя сбросить:
BASHOPTSBASH_ARGCBASH_ARGVBASH_LINENOBASH_SOURCEBASH_VERSINFOEUIDPIPESTATUSPPIDSHELLOPTSUID_Если вы попробуете это в интерактивной оболочке, не удивляйтесь, если она зависнет — это не так, но трудно сказать, когда у вас нет PS1.
См. unix.stackexchange.com/a/291913/112235, который должен работать в вашем случае.