.Bashrc создает родительскую оболочку, в которой текущая рабочая оболочка породила

Это может быть больше sed, чем вы ожидаете, но я думаю, что это лучший способ достичь того, что вы хотите с помощью sed.

Этот скрипт:

  • Вставляет строку

    перед каждой строкой, содержащей
    , если перед строкой нет других
    ,
    или
    .

  • Добавляет строку после каждой строки, содержащей

    , если строка после строки, содержащей
    , не содержит
    .

Этот sed сценарий использует sed hold пробел для запоминания предыдущей строки, чтобы ее можно было проверить на наличие тегов перед вставкой тега

. Он также использует относительную адресацию ADDR,+N, чтобы позволить добавить закрывающий тег
. Специальный случай необходим для определения, если
находится на последней строке файла и требует добавления . Для реализации логики широко используются тестирование (t и T) и ветвление (b).

#!/bin/sh

sed '
    /<dt>/ {
        x                  # exchange pattern and hold space
        s/<d[tdl]>//       # subsitutue, just testing for pattern
        g                  # copy hold space back, overwriting pattern space
        t end              # branch to :end if previous subsitution successful
        i \
<dl>
    }

    $ {
        /<dd>/ ! b end     # if <dd> on last line, append </dl>
        a \
</dl>
    }

    /<dd>/,+1 {            # on each line containing <dd> and the line after
        /<dd>/ b end       # if does not contain <dd>, insert </dl>
        i \
</dl>
    }

:end
    h                      # copy pattern space to hold space for next round

' "$@"

Этот сценарий изменяет данные примера, чтобы они выглядели следующим образом:

[...]

# Hardware #
<dl>
  <dt>RAM</dt>
  <dd>2GB</dd>
</dl>

# Partitions #

<dl>
<dt>`/dev/sda1`</dt>
<dd>/boot</dd>
<dt>`/dev/sda2`</dt>
<dd>/</dd>
</dl>
0
27.10.2018, 23:14
2 ответа

Нет, ~/.bashrcне запускает новую оболочку.

Файл инициализации ~/.bashrcимеет источник , т. е. считывается и выполняется в той же среде, что и оболочка, которая его вызвала (, а не как скрипт ).

Оболочка, по сути, выполняет source ~/.bashrcили . ~/.bashrcдля выполнения содержимого файла без порождения нового экземпляра оболочки.

Когда вы выполняете export variable=valueв командной строке (или variable=value; export variable), вы устанавливаете variableна valueи помечаете переменную как «экспортируемую», т. е. она превращается в переменную среды, которая будет быть унаследованы последующими процессами, запущенными из той же оболочки. exportне запускает новую оболочку.

2
28.01.2020, 02:23

Нет смысла создавать новую оболочку и .bashrcэто не скрипт, а текстовый файл. Вы можете увидеть, что происходит, когда отслеживаете PID вашей оболочки и вносите изменения в свой .bashrc. Чтобы они вступили в силу, просто введите исходный файл:

. ~/.bashrc

Новый процесс не создается. Это как если бы вы набрали вручную все строки, включенные в этот файл. exportсам по себе не требует новой оболочки. Изменяется только среда, которая может быть унаследована в будущем.

1
28.01.2020, 02:23

Теги

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