Замена строки SED

Я выполняю 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 (а затем перезагрузить его - это вы можете сделать отлично)
  • снимок, какие файловые дескрипторы открыты (а затем закройте все остальные - это не и никогда не может быть идеальным решением)

Добавьте это в конец вашего .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, на которые они указывают, не были изменены таким образом, чтобы как будет вести себя чтение или запись в этот файловый дескриптор.)

0
02.07.2018, 11:47
1 ответ
$ 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
0
28.01.2020, 04:19

Теги

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