Попробуйте это,
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
Вы всегда можете отключить расширение псевдонима, пока вы используете источник скрипта:
shopt -u expand_aliases;../myscript.bash; shopt -s expand_aliases
(myscript.bash
по-прежнему будет наследовать переменные, функции, umasks, лимиты, ловушки, перенаправления, параметры и т. д., которые вы могли установить в~/.bashrc
)
Насколько мне известно, невозможно автоматически применить изменения, сделанные в среде выполнения внешней оболочки, к текущей среде выполнения оболочки.
Вот доказательство того, как вы можете частично сделать это без изменения вашего 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
подвергнется расширению псевдонимов при eval
ued.