df сообщает небольшое число, потому что вы в основном удаляете каталоги, которые относительно малы. Кроме того, в зависимости от файловой системы, изменения в каталогах и изменения количества ссылок на файл журналируются и/или синхронизируются с диском немедленно, поскольку они критичны для восстановления после сбоев, и поэтому медленнее.
Это на самом деле свидетельствует об эффективности вашего связывания!
Проблема, несомненно, связана с Windows. Он имеет дело с размером окна TTY -; Чем уже размер окна, тем больше комбинаций символов перевода строки(LF
)и возврата каретки(CR
)символов будет добавлено при вставке в соответствии с узостью окна. Такие комбинации представлены как CRLF
.
Если я правильно понял сопровождающего Nano Бенно Шуленберга , Nano естественным образом преобразует CRLF
комбо в символы завершающих пробелов(^J
символы ).
Как предложил мне Бенно, добавление следующего кода в конец /etc/nanorc
решило эту проблему:
bind ^J enter main
С одной стороны, это отключит формирование ^J
символов, нарушающих код; с другой стороны, он добавит только символы перевода строки(LF
), применимые в Linux (, в отличие от комбинаций Windows CRLF
), к копируемым данным.
Только добавленные символы LF
хороши тем, что они предотвращают отображение вставляемых данных в виде одной длинной строки текста.
На изображении, которое вы разместили, показан возврат каретки (CR
на изображении). Это текстовый файл в формате DOS. Используйте dos2unix
или аналогичную утилиту для преобразования файла в правильный текстовый файл Unix.
В соответствии с комментарием ниже: Если вам абсолютно необходимо выполнять разработку в Notepad++ для Windows (лично я бы рекомендовал выполнять разработку в той же ОС, на которую вы ориентируетесь, если это вообще возможно), то программе можно указать сохраняйте текстовые файлы с новыми строками Unix, выбрав «Unix (LF)» в настройках «Новые документы»:
Убедитесь, что в вашем файле есть новая строка (LF
) в конце последней строки. Все строки в текстовом файле Unix (а сценарий оболочки является текстовым файлом) требуют завершающего символа новой строки в конце. Если в последней строке его нет, файл технически является не текстовым, а двоичным.
См. также, например, ответы на вопрос «Удалить символ ^M из лог-файлов»
К сожалению, конструкция эмуляторов терминала (, таких как окно терминала в вашей системе 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.