Step 9 (S-16694)

From Stepik Wiki
Revision as of 13:46, 3 March 2017 by Admin (Talk | contribs) (Create page for step id=16694)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Step on Stepik: https://stepik.org/lesson/6281/step/9

Общие рекомендации по решению задач на bash


В рамках нашего курса вам будет предложено 5 заданий, в которых вам потребуется написать bash-скрипт. Эти рекомендации расскажут как стоит подходить к решению таких задач, а также покажут наиболее распространенные ошибки и варианты их исправления.

Перед отправкой скрипта на проверку мы настоятельно рекомендуем запустить его в своем терминале, чтобы ''''убедиться, что в немнет синтаксических ошибок и что он корректно работает хотя бы на примерах из задания. Результаты должны совпадать с результатами из задания один в один, т.е. важны все символы, например, количество пробелов!
Для отправки скрипта на проверку вам нужно скопировать текст скрипта в соответствующую форму и нажать кнопку "Submit/Отправить". В скрипте вы можете пропустить строку шебанг (например, #!/bin/bash), т.к. наша система проверки её игнорирует и использует для запуска свою версию интерпретатора bash. Кроме того, учитывайте, что если вы копируете скрипт из текстового редактора в Windows, то в каждую строку скрипта может быть добавлен невидимый символ "возврата каретки", который вызовет ошибку проверки.

Наша система проверки не будет исследовать ваш код и искать в нем необходимые команды. Вместо этого она запускает отправленный скрипт на нескольких тестах и сверяет результаты его работы с эталонными. Таким образом, каждую задачу можно решить множеством различных способов, главное чтобы выполнялись поставленные условия. Для проверки мы используем обычный интерпретатор bash, но из-за некоторых технических особенностей и в целях безопасности на ваши скрипты накладываются небольшие ограничения, которые описаны ниже.

Если вы получаете от системы проверки ответ "Incorrect/Неверное решение", то для того, чтобы разобраться в причинах отказа стоит нажать на кнопку Feedback. Вы увидите сообщения одного из следующих видов:

Failed test #1 (или 2). Wrong answer. Результаты работы вашей программы на первом тесте отличаются от правильных. Первый тест полностью совпадают с первым примером из задания, поэтому если он у вас не работает, то проверьте ваш скрипт на этом примере. Если в задании есть второй пример, то тест №2 соответствует ему. Наиболее частые ошибки-расхождения это:

  1. Отсутствие пробела или наоборот лишний пробел. Например, "Alexey,your group is adult" не то же самое, что "Alexey, your group is adult" (сразу два расхождения).
  2. Отсутствие двоеточия. Например, "enter your age" не то же самое, что "enter your age:".
  3. Опечатки в словах. Например, "buy" вместо "bye" или "abult" вместо "adult".

Failed test #3 (4, 5, и т.д.). Wrong answer. Результаты работы вашей программы на третьем тесте отличаются от правильного. В заданиях нет третьего (и всех последующих) примеров, но они проверяют те фрагменты из задания, которые не покрыты первыми тестами. Например, если в задании написано, что калькулятор должен уметь выполнять сложение, вычитание, умножение и деление, а примеры описывают только сложение и вычитание, то тест №3 может проверять работу умножения, а тест №4 -- деления. Проверьте, что ваш скрипт выполняет все условия из задания.

Failed test #1. Run time error: jailed_code: line 14: syntax error: unexpected end of file. Ошибка в синтаксисе bash. Синтаксические ошибки бывают разных видов, обычно сообщение подсказывает как номер ошибочной строки, так и то, в чем собственно ошибка. Например, "unexpected end of file" обычно означает, что вы начали какую-то конструкцию bash, например, if, но забыли завершающее слово, например, fi (возможно оно потерялось при копировании скрипта в форму). Рекомендуем перечитать слайды лекций и исправить ошибки в синтаксисе.

Failed test #1. Run time error.Ошибка во время выполнения программы. Чаще всего это вызвано тем, что код возврата вашего скрипта отличен от нуля (обычно это означает в Linux ошибку выполнения программы). Например, вы выходите из скрипта при помощи exit 1 (следует исправить на exit 0). Вы можете проверить код возврата вашего скрипта, запустив в терминале echo Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://api.formulasearchengine.com/v1/":): {\displaystyle ?</code> сразу после его завершения (должно быть напечатано на экран число 0).<br /> <br /> Failed test #1. '''Time limit exceeded.''' Ваш скрипт &quot;завис&quot;. Например, он содержит цикл, который выполняет бесконечно или скрипт ждет ввода данных от пользователя, когда их уже не должны давать на вход. '''Проверьте''', что вы правильно описали '''условие''' '''выхода''' из цикла.<br /> <br /> Failed test #1. Run time error: jailed_code: '''fork: retry: No child processes''' ... '''Resource temporarily unavailable'''&quot;. В скрипте используются &quot;внешние&quot; вызовы, которые запрещены на нашем сервере в целях безопасности, чтобы, например, нельзя было удалить какие-то файлы из нашей системы при помощи rm. Под &quot;внешний&quot; вызов может попасть и совершенно неочевидные конструкции, поэтому к этой ошибке надо отнестись наиболее внимательно. Рассмотрим наиболее частые ситуации:<br /> # <code>echo &quot;GCD is `gcd } \$$arg1 Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://api.formulasearchengine.com/v1/":): {\displaystyle \$} arg2` -- вызываете свою функцию gcd (т.е. не внешнюю), но в косых кавычках. Можно исправить перенеся печать "GCD is Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://api.formulasearchengine.com/v1/":): {\displaystyle \$} results" прямо внутрь функции gcd, а в основном коде вызывать функцию как gcd Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://api.formulasearchengine.com/v1/":): {\displaystyle arg1 } arg2.

  1. echo Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://api.formulasearchengine.com/v1/":): {\displaystyle (expr x+y)</code> -- используете внешний обработчик выражений '''expr'''. Можно исправить, сделав в два действия: <code>let &quot;result = x + y&quot;</code> и <code>echo &quot;} result".
  2. while (true) -- вызов в круглых скобках также является внешним (по аналогии с косыми кавычками), стоит заменить на просто while true.
  3. pwd, touch, mkdir, rm и т.п. -- запрещены.

Иногда опечатки и синтаксические ошибки также могут быть восприняты как внешний вызов:

  1. Забыли пробел после ''' (или '''перед ). Например, конструкция if [["exit" == Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://api.formulasearchengine.com/v1/":): {\displaystyle var1 ]]</code> воспринимается как if c вызовом внешней программы <code>[[&quot;exit&quot;</code> с аргументами <code>==</code>, <code>} var1 и ]].
  2. Поставили пробелы около =. Например, var1 = 10 воспринимается как вызов внешней программы var1 с аргументами = и 10.
  3. Поставили знак Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://api.formulasearchengine.com/v1/":): {\displaystyle ''' перед переменной, '''когда это не нужно'''. Например, если в переменной <code>var1</code> записано слово &quot;test&quot;, а вы захотите записать туда слово &quot;test2&quot; при помощи <code>} var1=test2</code>, то bash воспримет это как вызов программы test=test2 (из-за знака доллара вместо переменной будет подставлено её значение, т.е. test).
  4. Опечатались в команде языка bash. Например, Echo вместо echo или braek вместо break.

Чаще всего такие ошибки легко найти, если вы запустите свой скрипт в терминале. Например, при ошибке описанной в пункте 2, терминал сообщит вам "var1: command not found/var1: команда не найдена".



Если вы проверили свой скрипт всеми описанными способами, но всё-равно не можете понять что не так, а в терминале у вас всё работает, то вам может помочь чтение комментариев других участников под этой задачей. Многие ошибки повторяются, так что возможно и для вашей проблемы уже написано решение!