с помощью bash вы можете сделать что-то вроде кода ниже :
Обратите внимание, что вам нужно будет использовать sed
или что-то еще, чтобы переформатировать строку даты во что-то, что date
примет, например:
"2017-05-13 15:44:20"
#!/usr/bin/env bash
last_run="2017-05-13 15:44:20"
function relative() {
local last_unix="$(date --date="$1" +%s)" # convert date to unix timestamp
local now_unix="$(date +'%s')"
local delta=$(( $now_unix - $last_unix ))
if (( $delta < 60 ))
then
echo "last run "$delta" seconds ago"
return
elif ((delta < 2700)) # 45 * 60
then
echo "last run "$(( $delta / 60 ))" minutes ago";
fi
}
relative "$last_run"
Что вы пытаетесь сказать? За |
должна следовать другая команда, а bash показывает >
, предлагая завершить конвейер.
Для выполнения обоих действий:
Передать стандартный вывод в стандартный ввод.
echo -n '' | cat
Здесь cat
- это просто заполнитель для вашей второй команды, которая в данном случае просто отправляет свой stdin на свой stdout.
|
- оператор для соединения двух команд.
cmd1 | cmd2
Запускает cmd1
и cmd2
параллельно со стандартным выводом cmd1
, подключенным к записывающему концу канала, и стандартным вводом cmd2
] подключен к считывающему концу той же трубы.
В:
cmd1 |
Вам не хватает правой команды.
Оболочка сообщает вам, что, выдав дополнительное приглашение ( PS2
, по умолчанию >
), чтобы запросить оставшуюся часть вашей команды.
Если вы хотите, чтобы stdout echo
был концом записи канала, а его stdin был концом чтения того же канала (но обратите внимание, что echo
не делает ») t читать из его стандартного ввода), вам нужно будет использовать оболочку вроде yash
, в которой есть оператор для этого (оператор перенаправления конвейера >> |
):
echo test 1>>|0
Это сообщает yash
, чтобы создать канал и назначить конец записи для fd 1 (stdout) и конец чтения для fd 0 (stdin).
Опять же, в этом мало смысла.