Ошибка Heredocument, которую я не могу понять («разделен концом файла»)

df сообщает небольшое число, потому что вы в основном удаляете каталоги, которые относительно малы. Кроме того, в зависимости от файловой системы, изменения в каталогах и изменения количества ссылок на файл журналируются и/или синхронизируются с диском немедленно, поскольку они критичны для восстановления после сбоев, и поэтому медленнее.

Это на самом деле свидетельствует об эффективности вашего связывания!

3
24.04.2017, 16:03
3 ответа

Проблема, несомненно, связана с Windows. Он имеет дело с размером окна TTY -; Чем уже размер окна, тем больше комбинаций символов перевода строки(LF)и возврата каретки(CR)символов будет добавлено при вставке в соответствии с узостью окна. Такие комбинации представлены как CRLF.

Решение

Если я правильно понял сопровождающего Nano Бенно Шуленберга , Nano естественным образом преобразует CRLFкомбо в символы завершающих пробелов(^Jсимволы ).

Как предложил мне Бенно, добавление следующего кода в конец /etc/nanorcрешило эту проблему:

bind ^J enter main

Уточнение решения

С одной стороны, это отключит формирование ^Jсимволов, нарушающих код; с другой стороны, он добавит только символы перевода строки(LF), применимые в Linux (, в отличие от комбинаций Windows CRLF), к копируемым данным.

Только добавленные символы LFхороши тем, что они предотвращают отображение вставляемых данных в виде одной длинной строки текста.


2
27.01.2020, 21:07

На изображении, которое вы разместили, показан возврат каретки (CR на изображении). Это текстовый файл в формате DOS. Используйте dos2unix или аналогичную утилиту для преобразования файла в правильный текстовый файл Unix.

В соответствии с комментарием ниже: Если вам абсолютно необходимо выполнять разработку в Notepad++ для Windows (лично я бы рекомендовал выполнять разработку в той же ОС, на которую вы ориентируетесь, если это вообще возможно), то программе можно указать сохраняйте текстовые файлы с новыми строками Unix, выбрав «Unix (LF)» в настройках «Новые документы»:

Notepad++ setting for new documents

Убедитесь, что в вашем файле есть новая строка (LF) в конце последней строки. Все строки в текстовом файле Unix (а сценарий оболочки является текстовым файлом) требуют завершающего символа новой строки в конце. Если в последней строке его нет, файл технически является не текстовым, а двоичным.

См. также, например, ответы на вопрос «Удалить символ ^M из лог-файлов»

10
27.01.2020, 21:07

К сожалению, конструкция эмуляторов терминала (, таких как окно терминала в вашей системе Ubuntu ), в большинстве случаев не обеспечивает хорошей поддержки вставки; в частности, по большей части вставка работает точно так же, как если бы вы очень быстро печатали )одно и то же (. Большинство вещей, которые вы могли бы принять за какой-то специальный сигнал для программы, работающей в терминале, на самом деле находятся в данных диапазона -, то есть просто в символе. Если ваша вставка содержит этот символ, программа не сможет определить разницу между вводом символа и его вставкой.

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

Трюк с cat > filenameвполне может потерпеть неудачу, если бы в вставляемом содержимом был элемент управления -D (да, это символ ). Но если вы избегаете управляющих символов (, кроме новой строки и табуляции ), это должно сработать.

Разработчики Unix обычно используют программы передачи файлов для перемещения файлов. Основной, который мы в основном используем, это scpили sftp, оба они являются частью SSH (и, таким образом, полностью зашифрованы, аутентифицированы и т. д. — те же гарантии безопасности, что и SSH ).

Самый простой способ работы между Windows и виртуальной машиной Ubuntu (или наоборот ), вероятно, заключается в использовании функций обмена файлами )вашего гипервизора (VM продукта — они есть у большинства. Вы можете выбрать каталог на хосте, и он будет виден внутри гостя. С помощью WSL вы можете получить доступ ко всем своим файлам Windows в папке /mnt/<drive letter>/. Если ваш гипервизор не поддерживает эту функцию, второй -самый простой способ — использовать обычный файловый ресурс. Вы можете смонтировать общие файловые ресурсы Windows из Ubuntu или установить Samba в Ubuntu, чтобы сделать общие файловые ресурсы для Windows.

В зависимости от того, что вы делаете,могут быть лучшие подходы. Например, автоматическое развертывание. Может быть, вы хотите, чтобы вы регистрировали файл в git, а затем он автоматически развертывался на вашем компьютере с Ubuntu, когда вы выполняете git push? Это может быть так же просто, как использование git hooks, или намного сложнее — для этого есть целые пакеты программного обеспечения.

Наконец, есть большое преимущество в том, чтобы записывать эти скрипты в файлы, а не просто вставлять их в оболочку. :Файл служит документацией того, что вы сделали. Что-то пошло не так? Если что-то пошло действительно неправильно, проверьте файл, чтобы понять, почему. Это позволяет точно определить, что пошло не так, что часто является первым шагом к устранению ущерба. Нужно сделать это снова? Просто создайте файл во второй раз. Нужно сделать что-то подобное? Отредактируйте файл, а затем источник его.

Если вам необходимо вставьте сюда -документ:

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

bash /dev/fd/10 10<<'SES'

cat <<EMR >> /etc/apache2/apache2.conf
#
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
EMR

SES

Если у вас должен быть отступ, вы можете использовать пробелы и sed вместо начального -для его удаления (обратите внимание, что вы пошли дальше и использовали stdin вместо fd 10, потому что синтаксис проще, и я сомневаюсь в этом вопросы):

sed -e 's/^\s\+//' <<'SES' | bash

    cat <<EMR >> /etc/apache2/apache2.conf
    #
    <Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
    </Directory>
    EMR

SES

Это использует функцию sed search -replace(s/PATTERN/REPLACEMENT/)для поиска в начале строки(^)пробела (\s), повторяющегося один или несколько раз (\+), и ничего не заменяет. Другими словами, он обрезает все начальные пробелы в каждой строке. Опция -eдля sed явно указывает, что это сценарий sed для запуска — на самом деле это не требуется, sed в любом случае интерпретирует свой первый аргумент как сценарий — но лично мне кажется более ясным всегда использовать -e.

Обратите внимание, что «пробелы» выше включают пробелы и табуляции (и еще несколько символов, которые здесь не очень важны ). Этот sed обрежет их все, независимо от используемого микса.

Конечно, я понятия не имею, почему вы вставляете команду в bash, говоря ему запустить bash для запуска cat.

7
27.01.2020, 21:07

Теги

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