Самый простой способ найти пропущенную цитату в bash скрипте?

Демонстрация с Perl Template::Toolkit (никакая потребность изучить Perl для использования tpage команда, установленная с модулем):

Шаблонный файл:

$ cat vhost.tpl

        ServerAdmin webmaster@localhost
        ServerName [% subdomain %].example.com
        DocumentRoot /var/www/[% subdomain %].example.com/htdocs

        # Possible values include: debug, info, notice, warn, error, crit, alert, emerg.
        LogLevel warn
        ErrorLog /var/log/apache2/[% subdomain %].example.com_error.log
        CustomLog /var/log/apache2/[% subdomain %].example.com_access.log combined

Поколение конфигурации:

$ tpage --define subdomain=domain.tld --interpolate vhost.tpl

        ServerAdmin webmaster@localhost
        ServerName domain.tld.example.com
        DocumentRoot /var/www/domain.tld.example.com/htdocs

        # Possible values include: debug, info, notice, warn, error, crit, alert, emerg.
        LogLevel warn
        ErrorLog /var/log/apache2/domain.tld.example.com_error.log
        CustomLog /var/log/apache2/domain.tld.example.com_access.log combined

7
25.05.2015, 02:01
4 ответа

xdotool достаточно хорош для этого.

Запустите xdotool getactivewindow и вы увидите результат (int) Окно может находиться над ЛЮБЫМ монитором. Просто прочитайте, где находится указатель x11 в ожидании щелчка:), и неважно, удаленное ли это окно, vncserver или 3-й рабочий стол среды рабочего стола куба. Просто работает.

Вы можете воспроизвести его, используя сон для лучшего тестирования сон 3; нажмите кнопку xdotool 1 + 2; xdotool getactivewindow .

Я вижу, что getwindowsfocus возвращает то же значение, что и getactivewindow .

Если Вы нажмете кнопку мыши вручную, Вы увидите контекстное меню, но при нажатии кнопки 1 + 2 оба щелчка активизируются при щелчке по текущему местоположению мыши и получении нужного идентификатора.

Попробуйте:)

-121--21915-

У меня есть альтернативные решения для этой ситуации. Допустим, у вас есть 1000 inodes в разделе 10G. Но из-за ограничения inodes не предполагается использовать все пространство раздела . Но в этих решениях можно использовать оставшееся пространство раздела без форматирования .

$ df -i  # see list ( I need just one free inode here so move just one file into other PARTITION)
/dev/part1  1000 999 1 99.9%     /data

$ dd if=/dev/zero of=/data/new_data
$ mkfs.ext4 /data/new_data
$ mkdir /data1
$ mount /data/new_data /data1

для постоянного монтажа

$ echo "/data/new_data /data1 ext4 defaults 0 1" >> /etc/fstab
-121--7134-

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

Для программы, которая в основном является инструкциями echo с «$ {MY _ ARRAY [1]» посередине, ShellCheck сообщает, что не удалось проанализировать приведённый ряд. Он даже связывает проблему с символом $ и указывает на неисправность расширения параметра.

ShellCheck работает с Vim, Emacs, SublimeText и Atom (среди прочих).

5
27.01.2020, 20:15

Неизведанный подход

tr -cd "'\n" < run_me.sh | awk 'length%2==1 {print NR, $0}'

TR Удаляет все персонажи, кроме одиночных кавычек и новых линий, и awk определяет линии, которые имеют нечетное количество символов (то есть, не совпадающие цитаты). Проверьте их индивидуально; Обратите внимание, что действительные строки, такие как «Это не ошибка!» будет помечено. Если это не подчеркивает проблему, попробуйте еще раз с «\ N» (найти не совпадающие двойные кавычки). Далее разверните TR , чтобы разрешить () , , {} , и в конечном итоге {} пройти через. С этой точки зрения, Ручная проверка выхода становится менее плодотворным преследованием; Хотя ( и ) обычно совпадают в одной линии, а цитаты и квадратные скобки почти всегда есть, Это не относится к { и } .

Если вы сузили проблему до биржи в курсы, И особенно если вы сузили диапазон в файле, перейдите к плану B. Откройте файл в VIM (или VI ). Перейти к { символ, который вы считаете, - до ошибки и типа % . Если курсор прыгает в } что вы думаете, соответствует { вы начали, Двигайтесь вперед к следующему { и повторите. Если он прыгает на } , который не соответствует {, которое вы начали, Ошибка происходит между этими двумя брекетами. Если это не двигается, Ошибка происходит между вашим текущим местоположением и концом файла. Увеличить.

Этот подход может быть немного лучше подходит для программных файлов на языках, таких как C, C ++ и Java (если их компиляторы не делают достаточно хорошую работу), Но он должен работать довольно хорошо для сценариев Shell.

7
27.01.2020, 20:15

Самый простой способ? Используйте редактор с раскраской синтаксиса, который знает об используемой вами оболочке и проверяет визуально. Когда вы получаете большую полосу цвета строки, вы знаете, что пропустили цитату. Практически любой приличный редактор программирования имеет синтаксическую раскраску.

Подсветка синтаксиса иногда ошибается, но обычно это признак того, что ваша программа слишком сложна, и люди, вероятно, тоже ошибаются.

Для программирования оболочки обязательно используйте шрифт, в котором ", ' и ` легко отличить друг от друга. Убедитесь, что вы случайно не использовались символы, отличные от ASCII, которые выглядят как кавычки ASCII, например '' «» .

5
27.01.2020, 20:15

Я смог решить большую проблему, с которой я столкнулся, в сценарии bash из 2000+ строк, используя низкотехнологичное решение от G-Man.

Я бы просто добавил следующую строку, которая делает то же самое для нечетного числа двойных кавычек, чем ответ G-Man для одиночных кавычек.

tr -cd "\"\n" < my_script.sh | awk 'length%2==1 {print NR, $0}'

Кстати, shellcheck.net очень хорош, и каждый хороший скрипт должен пройти через это.

1
27.01.2020, 20:15

Теги

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