bash script autobeautifiying с использованием declare -f

Я пытаюсь «украсить» скрипты автоматически, используя declare -f function

В двух словах: Учитывая сценарий bash foo , вы можете, по-видимому, «автоматически» отступать от него, делая в bash: MAGIC () { ...here you copy/paste the whole foo script... ; } ; declare -f MAGIC MAGIC () { ...here you copy/paste the whole foo script... ; } ; declare -f MAGIC

Я предоставляю пример сценария ниже, который делает это для любого скрипта, который вы даете ему как вход.

Мой вопрос: каковы основные оговорки об использовании функции включения, а затем declare -f ?

  • какие-либо особые опасности?
  • ограничение на число вложенных функций? (Я могу иметь функции в скрипте, они тоже с отступом, но сколько уровней я могу уйти?)
  • «не сможет это сделать / интерпретировать это / …»? (кажется, awk-скрипт отлично работает и даже немного отступил (главный скрипт выровнен по отношению к остальной части скрипта) … но какие (другие) вещи могут создавать проблемы?
  • потеряет информацию? Я заметил: он удаляет пустые строки и комментарии ( # ... ), но что еще он отбрасывает / модифицирует?

Я хочу получить ваш вход, прежде чем я смогу использовать свой скрипт «indent» ниже, чтобы повторно добавить кучу bash-скриптов …

Вот моя первая попытка, комментарии (и ответы на упомянутые выше проблемы) приветствовали:

 #!/usr/bin/bash # parameters: $@ = bash (only) scripts that need reindentations. for script in "$@" ; do tmpfile="${script}.BEAUTIFY.tmp" finalfile="${script}.BEAUTIFY" # optionnal temporisation... echo "I am about to create ${script}.BEAUTIFY from the bash (I hope) script: ${script} . Press return if OK, ctrl-C if not" read temporisation # we output the following commands into a pipe to a subshell bash: { sleep 1 echo " # declare surrounding function . The script has to be bash, but can contain also functions, etc. # Will lose # comments and blank lines, but maybe also other things... hence the Question on unix.se ODBEAUTIFIER () { $(cat "$script") } # print if via declare -f, to pretiffy it declare -f ODBEAUTIFIER > \"${tmpfile}\" # then get rid of the surrounding ODBEAUTIFIER function: tail -n +3 \"${tmpfile}\" | tac | tail -n +2 | tac | sed -e 's/ //' > \"${finalfile}\" # and displays the resulting file ls -l \"${script}\" \"${finalfile}\" \rm \"${tmpfile}\" ; # that rm has a backslash to avoid aliases to rm -i " } | bash ; # that sub- bash receives the input and interprets it done 

Примечание / редактирование : существует обходное решение (но со многими оговорками и опасностями), чтобы избежать «declare -f будет терять комментарии, начинающиеся с #»: но кажется, что это отвлекает (… по крайней мере один настаивающий пользователь, см. Комментарии ниже ^ ^) из основного вопроса (Даже жестко я процитировал много предостережений об обходном пути, я предпочитаю убрать его упоминание выше, поскольку это вовсе не проблема вопроса. Любопытные умы могут ссылаться на редактирование до сих пор ^^)

One Solution collect form web for “bash script autobeautifiying с использованием declare -f”

Существует риск для безопасности при чтении в скрипте в виде функции, а затем в другую оболочку: если входной файл содержит непревзойденный } , то все, что следует за ним, будет выполнено (и опущено на выходе).

Несовпадение } может произойти случайно или злонамеренно. Обычно это приводит к тому, что bash сообщает о синтаксической ошибке, но злоумышленник может скрыть это (от пользователя, выполняющего сценарий beautify), закончив файл другой, незавершенной функцией:

 } echo "insert shellcode here" > ~/RCFILE function end_func { true 

Менее важно:

  • Вы упомянули, что он теряет комментарии, начиная с # . Это включает открытие #!/bin/... , поэтому он может помешать работе выходных файлов.

  • sed -e 's/ //' разбивает первые 4 пробела в любой строке. Обычно это 4 пробела, добавленные declare . Но declare не вставляет пробелы перед строками здесь-документа, поэтому это может удалить другие пробелы, которые были частью оригинала.

  • Вы можете использовать head -n -1 вместо tac | tail -n +2 | tac tac | tail -n +2 | tac tac | tail -n +2 | tac . Или вы можете удалить оба tail и использовать sed '1,2d;$d' .

  • Как классифицировать эти строки в этом файле ASCII
  • Как скрипт с systemd-cgtop?
  • Как проверить, нет ли строки в tcsh
  • поиск имен папок на основе списка, содержащегося в файле .txt
  • Как проверить, соответствует ли имя файла шаблону?
  • Скопируйте файлы из каталога, если имя присутствует в текстовом файле
  • Как войти в удаленную учетную запись пользователя с помощью пароля и выполнить набор команд?
  • Введите URL-адрес и статус HTTP-статуса
  • Регулярные выражения для дезинфекции телефонных номеров
  • grep с количеством отдельных паттернов
  • Как изменить рабочие каталоги с помощью KDialog?
  • Interesting Posts

    Приоритет процесса и скорость процессора

    Удален рабочий стол GNOME, не удается подключиться к Интернету с терминала

    Как создать сайт в Apache 2 Debian 8?

    Поведение stdin / stdout в сочетании с подоболочками и командой cd

    Как использовать команду find для поиска нескольких расширений

    Regex on Postfix с использованием Centos

    Мониторинг скорости вращения вентилятора процессора в системе Lenovo x3650 m5 (8871) на RHEL7

    Solus 1.1 добавляет двунаправленный буфер обмена

    Linux Mint 17.3 и Ubuntu 15.10 Оба замораживания после загрузки в режиме реального времени USB

    Изменить строку, если оригинал не соответствует определенной строке.

    GNU / Linux: как определить сопоставления жесткого диска?

    bash – Как я могу повторно отобразить меню выбора после выбора и выполнения выбора

    Как права на файлы работают с файловой системой раздела?

    Создание самбы, нетаталка и авахи (bonjour) на малине pi

    Беспроводные сети продолжают запрашивать пароль для каждого дистрибутива

    Linux и Unix - лучшая ОС в мире.