Я выполняю exec bash
. Он очищает переменные и функции. Он не должен очищать вновь открытые файловые дескрипторы (с помощью exec $ someNumber <> somefile
) или экспортированные переменные, но я редко открываю новые файлы с помощью exec
и мои файлы запуска (которые получают загружается, когда вы выполняете exec bash
) восстанавливаете переменные среды, которые мне небезразличны (например, PATH
), в состояние, в котором они должны быть.
(
Выполнение простого bash
имеет тот недостаток, что он прикрепит другую оболочку к вашей текущей, поэтому вам придется выйти из
еще раз.
)
Если я не забочусь об очистке дополнительных переменных и функций, я просто перезагружаю точечные файлы.
Я редактирую ~ / .bashrc
и перезагружаю его довольно часто, поэтому у меня есть клавиатурное сокращение для комбо:
bashrcEdit() { $EDITOR "$HOME/.bashrc"; }
bind -x '"\C-e": bashrcEdit && bashrcReload'
и для простой перезагрузки:
bind -x '"\C-o": bashrcReload;'
( Моя функция перезагрузки это:
bashrcReload() { unset bashrcSourced; unset PROFILE_SOURCED; source "$HOME/.bashrc"; }
вместо просто:
source "$HOME/.bashrc";
Он имеет unset
s, потому что эти переменные (первая неэкспортированная - для .bashrc
, вторая экспортированная - для .profile
) служат в качестве двойной защиты включения в моей настройке - без этих unset
s, source
ing .bashrc
не будет работать в моей настройке. { {1}})
Если вы хотите быть внимательным, вы можете
Добавьте это в конец вашего .bashrc
:
#Take a snapshot of the env and fds
envSnap() {
export FDS="$(/bin/ls /proc/$$/fd/)"
export ENV="$(export -p)"
}
#Restore env, close extra fds, and re-exec bash
envRestore(){
exec env - ENV="$ENV" bash --noprofile -c '
eval "$ENV"
for fd in `{ /bin/ls /proc/$$/fd; echo "$FDS"; } | sort | uniq -u`; do
eval "exec $fd>&-"
done
exec bash
'
}
#Take the snapshot now
envSnap
Теперь вы можете выполнить envRestore
, чтобы практически полностью восстановить среду.
Например, если вы выполните:
export FOO=bar
touch file
exec 5<file
Тогда после exec bash
у вас все еще будет:
/ bin / ls / proc / self / fd
включает 5, а echo $ FOO
печатает bar
.
Однако, если вы используете envRestore
вместо exec bash
, тогда / bin / ls / / proc / self / fd
не должно включать 5 ( если ваш bash обычно не начинается с fd 5 open) и echo $ FOO
должны выводить пустую строку.
(Файловые дескрипторы являются слабым местом этого, потому что закрытие дополнительных файловых дескрипторов не гарантирует, что исходные файловые дескрипторы не были перенаправлены или что записи vtable, на которые они указывают, не были изменены таким образом, чтобы как будет вести себя чтение или запись в этот файловый дескриптор.)
$ cat test.txt
[Data_Foundation.WF:wf_STG_SIM_RKEM_RKEMMOVE]
$Param_Object_Name=RKEMMOVE
[Data_Foundation.WF:wf_STG_SIM_RKEM_RKEMEQBC]
$Param_Object_Name=RKEMEQBC
[Data_Foundation.WF:wf_STG_SIM_RKEM_RKEMEQCM]
$Param_Object_Name=RKEMEQCM
[Data_Foundation.WF:wf_STG_SIM_RKEM_RKEMLMOV]
$Param_Object_Name=RKEMLMOV
$
$ echo ${VAR}
EFG
$
$ sed "s/.*\(\.*WF.*$\)/\[$VAR.\1/" test.txt
[EFG.WF:wf_STG_SIM_RKEM_RKEMMOVE]
$Param_Object_Name=RKEMMOVE
[EFG.WF:wf_STG_SIM_RKEM_RKEMEQBC]
$Param_Object_Name=RKEMEQBC
[EFG.WF:wf_STG_SIM_RKEM_RKEMEQCM]
$Param_Object_Name=RKEMEQCM
[EFG.WF:wf_STG_SIM_RKEM_RKEMLMOV]
$Param_Object_Name=RKEMLMOV