Проблема возврата каретки

Здесь некоторое обсуждение к взламыванию с inotify, чтобы заставить его предоставить Вам PID и UID. http://www.ioremap.net/node/55

Также взгляд на Аудит http://andries.filmer.nl/kb/Monitoring-file-system-events-with-inotify,-incron-and-authctl/129#Audit

4
07.06.2013, 02:51
5 ответов

Возврат каретки откладывает курсор к началу строки. Ваша выходная строка:

    This is yesterday date:20130605<Cr>end

Кроме, когда терминал совершает нападки <Cr> это возвращает курсор началу строки и перезаписывает символы, которые являются там.

Другими словами, "Thi" заменяется "концом", производя:

    ends is yesterday date:20130605

Чтобы сделать, что Вы, кажется, пытаетесь сделать, Ваш сценарий должен выглядеть примерно так:

   variable="text"
   echo "Some sentence $variable"

Который произведет

   Some sentence text

ЕСЛИ существуют случайные возвраты каретки, они должны обнаружиться как ^M в vi (как Bruce сказал),

Решение 1

Лучший способ удалить возвраты каретки или другие непечатаемые символы с tr команда с -d опция, которая удаляет любой экземпляр отдельного символа, с \r который является escape-последовательностью для возврата каретки:

    tr -d '\r'

Это удалит все возвраты каретки. Выполните его на сценарии для удаления всех экземпляров возвратов каретки, затем перезапишите исходный файл сценария:

    tr -d '\r' yourscript.bash > temp
    mv temp yourscript.bash

Решение 2

или в то время как в vi со сценарием, открытым, войдите:

    :%s/\r//g
    :wq

Для удаления возвратов каретки в рамках документа затем сохраняют его.

6
27.01.2020, 20:47

Принятие <Cr> представляет возврат каретки, удалите возврат каретки из конца первой строки. Вот острота, чтобы сделать это для Вас:

sed -i '1s/\r//' script.sh

Для наблюдения возвратов каретки в сценарии выполните следующее.

od -c script.sh | grep --color=yes '\r'
3
27.01.2020, 20:47

Использовать vi или vim смотреть на рассматриваемый сценарий удара. Необходимо рассматривать любые случайные возвраты каретки как '^M' (каре, они) две последовательности символов. Используйте hjkl для перемещения курсора через возвраты каретки, поразите 'x' для удаления их, затем ": wq" для выхода vi.

Мое предположение было бы то, что случайный возврат каретки вошел в файл, когда кто-то переместил файл в машину Windows, отредактировал его с Notepad или Wordpad, и затем положил обратно его к Linux.

1
27.01.2020, 20:47

В сценариях оболочки CR является обычным символом, не пробелом как на многих других языках. Та строка DAY2="20130605"<Cr> наборы DAY2 к 9 символьным строкам это эквивалентно DAY2=$'20130605\r'. echo строка эквивалентна echo $'This is yesterday date:20130605\rend'. Символ CR ($'\r') перемещает курсор в начало строки, таким образом (¡ указывает на позицию курсора):

This is yesterday date:¡               #after printing up to date:
This is yesterday date:20130605¡       #after printing up to 20130605
¡This is yesterday date:20130605       #after printing the CR
end¡s is yesterday date:20130605       #after printing end

Удалите CR из сценария.

1
27.01.2020, 20:47

Точно то, как тот возврат каретки оказался, трудно сказать.

Если бы сценарий был сгенерирован другим сценарием или приложением, то это могло бы быть ошибкой или предназначило неудачу.

Скорее всего, Вы или кто бы ни отредактировал файл, неумышленно нажали порождение сочетания клавиш CR быть вставленным.

Примеры:

  • vim : Ctrl-m Ctrl-v
  • emacs: Ctrl-m Ctrl-q
  • И многие другие.

Существуют другие символы, которые могут доставить неприятности также, например, no-break-space в коде и т.д. Это обычно вызывает странные ошибки при запущении скриптов или компиляции кода.

Я обычно использую vim и часто набор (имеют сочетание клавиш для переключения этого):

match Error /[^ -~\t]/

Это: выделите все, но <space> кому: ~ в ASCII и tab с Error, обычно белый на красном и т.д.

Для файлов кода я обычно имею, это установлено на по умолчанию.


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

Например:

#!/bin/bash

for i in {1..100}; do
    printf "We are now at %3d%%\r" "$i"
    sleep .1
done

printf "\nAll done.\n"

\r, при использовании printf результат в <CR> или возврат каретки.
\n, при использовании printf результат в <LF> или перевод строки.

0
27.01.2020, 20:47

Теги

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