Запускать bash без пользовательской конфигурации, сохраняя при этом возможность устанавливать привязки

Попробуйте это,

awk '/^$/{comm=0}{if($1~/^#/){comm=1}else{if(comm){$1="# "$1}} print}' file

или то же самое в полной форме:

awk '
    # reset on empty line
    /^$/{comm=0}
    {
        if ($1~/^#/) {
            # start commenting lines when # found
            comm=1
        } 
        else { 
            # comment lines not starting with #
            if (comm){ $1="# "$1 } 
        }
        print
    }
' file
1
24.03.2021, 22:06
2 ответа

Вы всегда можете отключить расширение псевдонима, пока вы используете источник скрипта:

shopt -u expand_aliases;../myscript.bash; shopt -s expand_aliases

(myscript.bashпо-прежнему будет наследовать переменные, функции, umasks, лимиты, ловушки, перенаправления, параметры и т. д., которые вы могли установить в~/.bashrc)

4
28.04.2021, 22:57

Насколько мне известно, невозможно автоматически применить изменения, сделанные в среде выполнения внешней оболочки, к текущей среде выполнения оболочки.

Вот доказательство того, как вы можете частично сделать это без изменения вашего my-script.shскрипта:

{. <(bash <(cat my-script.sh - <<'EOT'
declare -pf >&3
alias -p >&3
EOT
) 3>&1 1>&4); } 4>&1

Таким образом, содержимое my-script.shвыполняется в своем собственном не -неинтерактивном bashэкземпляре, который не является источником ~/.bashrcи не наследует псевдонимы и не -экспортируемые переменные и функции. declareи aliasприсоединяются к нему для вывода псевдонимов и определений функций из этой среды. Перетасовка файловых дескрипторов гарантирует, что вывод my-script.shпечатается на внешний стандартный вывод (по умолчанию, терминал ), в то время как команда sourceполучает только вывод добавленных aliasи declare.
Обратите внимание, что (, как Stéphane Chazelasуказал ), исходный контент подвергнется расширению псевдонимов, что, возможно, сведет на нет весь смысл этого упражнения.
Кроме того, как командная строка (, например. в выводеps)и имени команды в дочернем процессе Bash (, используемом, например, при печати сообщений об ошибках ), будет менее значимым — путь к временному файлу, созданному подстановкой процесса.

В качестве альтернативы вы можете временно сохранить часть текущей среды, удалить ее, создать исходный код сценария, а затем восстановить удаленную часть. Для псевдонимов:

aliases=$(alias -p)
unalias -a
. my-script.sh
eval "$aliases"

Для функций:

shopt -s extglob                             # (There likely
functions=$(declare -pf)                     # is a cleaner
readarray -t funcnames < <(declare -pF)      # way to
unset -f "${funcnames[@]#declare -f*(x) }"   # do this)
. my-script.sh
eval "$functions"

Опять же,следует отметить, что содержание functionsподвергнется расширению псевдонимов при evalued.

1
28.04.2021, 22:57

Теги

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