Bash: новая строка в строке эхо-сигнала терпит неудачу, когда вывод передается в crontab [duplicate]

Могут быть только одно объяснение: Вы находитесь в Украине.

Позвольте мне объяснить:

  • При передаче отдельных компонентов в Date, эти значения основаны на локальном часовом поясе компьютера, на котором выполняется код. Помня о том, что месяцы основаны на нуле, new Date(1924,4,1,0,0,0,0) запрашивает местное время 1924-05-01 00:00:00.000 по местному времени .
  • .getTime() запрашивает отметку времени Unix в миллисекундах, которые основаны в UTC - поэтому происходит неявное преобразование с локального времени в UTC. Поэтому каждый, кто запускает этот код, будет получать разные результаты в зависимости от своего собственного часового пояса.
  • Часовые пояса являются относительно современным изобретением. Они не всегда существовали так, как мы их используем сегодня. Данные, хранящиеся в большинстве часовых поясов, поступают из базы данных часовых поясов IANA . В этих данных для большинства часовых поясов самая ранняя запись основана на локальном среднем времени солнечного (LMT) для широты и долготы, связанных с городом, используемым для идентификации часового пояса.
  • В этом случае ваше значение -1441245724000 переводится в 1924-04-30 21:57:56 UTC. Поскольку он был получен из локального времени полуночи, то по математике - смещение от UTC в это локальное время должно быть +02:02:04.
  • Единственный часовой пояс в TZDB со значением LMT +02:02:04 Europe/Kiev, , как показано здесь . По причинам, в которых я точно не уверен, TZDB также назначает аббревиатуру KMT (время по Киеву) с 1880 по 1924 год.

Что касается того, почему вы видите это на более новых версиях Chrome - вполне вероятно, что более старые версии не учитывали весь TZDB, но урезали его в какой-то момент в прошлом. Действительно, стандарт ECMAScript 5.1 использовался, чтобы требовать применения только текущего правила часового пояса, как если бы оно действовало на все время. Это было удалено в ECMAScript 6, и большинство браузеров теперь используют правильное правило, которое действовало для предоставленной метки времени.

TL; DR : Местное время в Украине до 1 мая 1924 года была определена солнцем - не правительством. По крайней мере, это самая известная информация о вашем компьютере.

1604
задан Mateusz Piotrowski 27 March 2016 в 09:46
поделиться

16 ответов

Вместо этого вы можете использовать printf:

printf "hello\nworld\n"

printf имеет более последовательное поведение, чем echo. Поведение echo сильно различается в разных версиях.

1969
ответ дан sth 24 August 2018 в 01:11
поделиться
str='hello\nworld'
$ echo | sed "i$str"
hello
world
14
ответ дан alinsoar 24 August 2018 в 01:11
поделиться

Вы также можете использовать эхо с фигурными скобками,

$ (echo hello; echo world)
hello
world
1
ответ дан Avinash Raj 24 August 2018 в 01:11
поделиться

Вы уверены, что находитесь в bash? Работает для меня всеми тремя способами:

echo -e "Hello\nworld"
echo -e 'Hello\nworld'
echo Hello$'\n'world
1315
ответ дан choroba 24 August 2018 в 01:11
поделиться

POSIX 7 на echo

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html

-e не определено, а обратные косые черты определены реализацией:

Если первый операнд равен -n, или если какой-либо из операндов содержит символ & lt; обратного слэша, результаты определяются по реализации.

, если у вас нет дополнительного расширения XSI.

. Вместо этого используйте printf :

format используется в качестве строки формата, описанной в XBD Format Format Notation [...]

Обозначение формата файла :

\n & lt; newline> Переместите положение печати в начало следующей строки.

Также имейте в виду, что Ubuntu 15.10 и большинство дистрибутивов реализуют echo как:

  • a Встроенный Bash: help echo
  • автономный исполняемый файл: which echo

, который может привести к некоторой путанице.

14
ответ дан Ciro Santilli 新疆改造中心 六四事件 法轮功 24 August 2018 в 01:11
поделиться

Это можно сделать лучше, так как функция

x="\n"
echo -ne $x

-e будет интерпретировать обратные следы для последовательности escape-последовательности. Опция -n удалит конечную новую строку на выходе

PS: Команда echo имеет эффект, всегда включающий завершающую новую строку в выходе, поэтому -n требуется отключить эту вещь (и сделать ее менее запутанной)

1
ответ дан Dhwanit 24 August 2018 в 01:11
поделиться

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

function foo()
{
    local v="Dimi";
    local s="";
    .....
    s+="Some message here $v $1\n"
    .....
    echo $s
}

r=$(foo "my message");
echo -e $r;

Только этот трюк работал в Linux Я работал над этим bash:

GNU bash, version 2.2.25(1)-release (x86_64-redhat-linux-gnu)

Надеюсь, что это поможет кому-то с подобной проблемой.

4
ответ дан DNT 24 August 2018 в 01:11
поделиться

Вы всегда можете сделать echo "".

, например

echo "Hello"
echo ""
echo "World"
91
ответ дан fedorqui 24 August 2018 в 01:11
поделиться

Try

echo -e "hello\nworld"
hello
world

работал для меня в nano-редакторе.

22
ответ дан Harsha B 24 August 2018 в 01:11
поделиться

Иногда вы можете передать несколько строк, разделенных пробелом, и будет интерпретироваться как \n.

Например, при использовании сценария оболочки для многострочных уведомлений:

#!/bin/bash
notify-send 'notification success' 'another line' 'time now '`date +"%s"`
0
ответ дан Hunter Frazier 24 August 2018 в 01:11
поделиться

В bash 4.4 добавлено новое расширение параметра , которое интерпретирует escape-последовательности:

${parameter@operator} - E operator

Расширение - это строка, которая представляет собой значение параметра с последовательностями escape-обратного слэша, расширенными, как и механизм цитирования $'…'.

$ foo='hello\nworld'
$ echo "${foo@E}"
hello
world
0
ответ дан PesaThe 24 August 2018 в 01:11
поделиться
echo $'hello\nworld'

печатает

hello
world

$'' строки используют ANSI C Цитирование :

Слова формы $'string' обрабатываются специально. Слово расширяется до строки с заменой символов с обратным слэшем, как это определено стандартом ANSI C.

427
ответ дан Rory O'Kane 24 August 2018 в 01:11
поделиться

Это работает для меня в raspbian,

echo -e "hello\\nworld"

18
ответ дан Sathesh 24 August 2018 в 01:11
поделиться

Мой скрипт:

echo "WARNINGS: $warningsFound WARNINGS FOUND:\n$warningStrings

Вывод:

WARNING : 2 WARNINGS FOUND:\nWarning, found the following local orphaned signature file:

В моем сценарии bash я злился, пока я не попробовал:

echo "WARNING : $warningsFound WARNINGS FOUND:
$warningStrings"

Просто нажмите Enter, где вы хотите вставить этот прыжок. Выходные данные теперь:

WARNING : 2 WARNINGS FOUND:
Warning, found the following local orphaned signature file:
3
ответ дан TanisDLJ 24 August 2018 в 01:11
поделиться

В случае непредвиденного случая, когда кто-то обнаруживает, что он бьется головой о стену, пытаясь понять, почему сценарий коллеги не будет печатать новые строки, обратите внимание на это ->

#!/bin/bash
function GET_RECORDS()
{
   echo -e "starting\n the process";
}

echo $(GET_RECORDS);

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

Затем вы можете сообщить своим товарищам, что лучший способ выполнения функций будет таким:

#!/bin/bash
function GET_RECORDS()
{
   echo -e "starting\n the process";
}

GET_RECORDS;
33
ответ дан Uncle Iroh 24 August 2018 в 01:11
поделиться

он работает для меня в centos

echo -e ""hello\nworld""
0
ответ дан vanishedzhou 24 August 2018 в 01:11
поделиться