Запуск скрипта в чистой среде

#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:

Комментарии:

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 .