Сообщение об ошибке синтаксиса сценария оболочки: «неожиданный конец файла» и «неожиданный EOF при поиске совпадения« »'"

Можно ли восстановить файл?

Краткий ответ: Обычно нет.

@Mark Plotnick отмечает в комментариях, что вы можете восстановить файлы .py из .pyc с помощью Uncompyle. Это должно быть идеальным для вашей ситуации.

В целом, однако, это намного сложнее. Теоретически вы можете использовать инструменты криминалистики для восстановления файлов. Вероятно, самым простым из тех, что я использовал, является testdisk (также известный как «PhotoRec»). Это работает только иногда, и это медленный процесс. Обычно оно того не стоит, так что да, возможно, но реальный ответ — «нет».

Можно ли изменить >, чтобы не перезаписывать исполняемые файлы?

Нет. Не существует стандартного способа указать оболочке никогда не перенаправлять только файлы, помеченные как исполняемые. Существует «noclobber», который предотвратит перенаправление в существующие файлы, исполняемые или нет, но см. мои комментарии ниже.

Что делать в будущем?

  1. Это может показаться глупым, но чтобы предотвратить ошибки в будущем, вам, вероятно, не нужно ничего делать. Могу поспорить, что вы уже усвоили этот урок.

    Я использую и преподаю Unix в течение очень долгого времени, и хотя люди часто совершают эту ошибку один раз, они редко повторяют ее. Почему нет? Вероятно, по той же причине человек, имеющий опыт обращения с ножами, не режет себя: люди хорошо учатся.В конце концов, делать правильные вещи становится второй натурой.

  2. Воспользуйтесь текстовым редактором, который сделает для вас резервные копии. Например, если вы используете emacs , предыдущая версия вашей программы сохраняется в mac_ip.py~. Аналогично можно настроить и другие редакторы (например, «установить резервную копию» в .nanorc). Для редакторов, которые не поддерживают автоматическое резервное копирование, вы можете сделать упрощенную функцию в вашем .bashrc:

     myeditor() { cp -p "$1" "$1~"; редактор "$1"; }
     
  3. Упростите себе процесс копирования. Например, в каталоге проекта, над которым вы работаете, у вас может быть Makefile с такой целью:

     # Используйте `make tar` для резервного копирования всех файлов в этом каталоге.
    # Имя файла tar будет ../-.tar.gz
    DIRNAME = $(базовое имя оболочки `pwd`)
    TIMESTAMP = $(дата оболочки +%s)
    смола:
     @echo "[Старение ${DIRNAME}.tar.gz]"
     (cd .. ; tar -zcvf "${ИМЯ КАТАЛОГА}-${TIMESTAMP}.tar.gz" "${ИМЯ КАТАЛОГА}")
     

    (Примечание: stackexchange неправильно отображает TAB выше как 4 пробела.)

  4. Точно так же вы можете создать цель Makefile, которая выполняет rsync с удаленным хостом Unix, который у вас есть ssh доступ к. (Используйте ssh-copy-id, чтобы пароль не запрашивался повторно.)

  5. Используйте git . Есть много отличных руководств по началу работы. Попробуйте man gittutorial , man gittutorial-2 и man giteveryday . Настроить собственный репозиторий git несложно, но вы также можете бесплатно создать удаленный репозиторий на github.com

  6. Если приведенные выше решения слишком тяжелы, вы можете сохранить небольшие скрипты на gist.github.com. Хотя можно вставлять или загружать из веб-браузера, я рекомендую использовать интерфейс командной строки, чтобы все было очень просто.

Я настоятельно не рекомендую использовать "noclobber".

Да, если хотите, вы можете set -o noclobber установить -o noclobber, чтобы получать сообщения об ошибках всякий раз, когда вы пытаетесь перезаписать существующий файл. Это плохая идея, на мой взгляд. *

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

Как вы, наверное, знаете, оболочка Unix была задумана как удобный инструмент для экспертов. Он быстрый в использовании и не будет мешать вам — и порежет вас, если вы забудете, какой конец острый. Но чем больше вы его используете, тем больше, я думаю, вы оцените, что это может быть хорошо.


* Сноска: возможно, отнеситесь к моему мнению с недоверием. Я также из тех людей, которые думают, что велосипедные тренировочные колеса - плохая идея.

1
21.08.2018, 03:33
1 ответ

Ради критики, в дополнение к ответам в комментариях, могу я предложить вам попробовать применить следующую технику:

  • размещение переменных в кавычках:

echo "Number_of_correct_answers $ {right} "

Например, это поможет избежать проблем, когда $ right может расширяться в определенных ситуациях с нежелательными эффектами.

  • используйте "вместо $ ()

Используя", хотя невозможно выполнить вложение так же, как $ ($ ()) , обратные кавычки обратно совместимы с / bin / sh, который немного более доступен, чем / bin / bash (например, более старый Solaris и т. д.).

  • не пытайтесь вложить ""

Если возможно, когда вам нужно поместить кавычки в такие вещи, как awk, попробуйте использовать 'вместо ", если это действительно необходимо, тогда HEREDOC может быть более подходящим.

0
28.01.2020, 01:00

Теги

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