Я использую Ubuntu Server 16.04, и я хочу использовать утилиту at
в моем текущем сеансе, чтобы сделать что-то через 1 минуту (скажем, an echo
), без указания конкретной даты и времени - всего на 1 минуту вперед от текущего времени.
Это не удалось:
echo 'hi' | at 1m
Причина я выбираю at
более sleep
потому , что недостатки сна текущего сеанса и для них больше подходит для задержки команд в другой сессии, а не один мы работаем с большой частью времени. AFAIR, at
не ведет себя так и не будет препятствовать моей сессии.
Update_1
По ответу Пьед Пайпер, я попробовал:
(sleep 1m; echo 'hi') &
У меня проблема с этим методом: поток «hi» печатается внутри моей основной подсказки, а также добавляет пустую вторичную подсказку ( _
) прямо под первичной подсказкой, которая его содержит, см .:
USER@:~# (sleep 1m; echo 'hi') &
[1] 22731
USER@:~# hi
^C
[1]+ Done
Update_2
По ответу Питера Корде я попытался:
(sleep 2 && echo -e '\nhi' && kill -WINCH $$ &)
Это работает должным образом в Bash 4.4, но, по-видимому, не в некоторых старых версиях (см. Комментарии в ответе). Я лично использую Bash 4.3 в своей среде.
Ответы:
Нет, это не "напечатано в вашем
stdin
".Если вы нажмете return, он не будет запускаться
hi
как команда. Просто фонecho
печатается,hi
пока курсор был после вашего приглашения.Возможно, вы хотите напечатать ведущий символ новой строки , как
(sleep 1m && echo -e '\nhi' &)
. (Отрегулируйте по мере необходимостиecho
в вашей оболочке. Или используйтеprintf
для переносимости.)Я поместил
&
внутреннюю часть подоболочки, чтобы «отречься» от фоновой работы, чтобы вы также избежали «шума»[1]+ Done
. С&&
между командами,&
относится ко всему соединение-командной цепи, поэтому он возвращается к оболочке приглашение сразу , а не ждать ,sleep
чтобы выйти , как вы получите с(sleep 1; echo ... &)
Вот что происходит (с задержкой в 1 секунду):
Bash не знает, что
echo
напечатал что-то, поэтому он не знает, что нужно перепечатать его подсказку или очистить экран. Вы можете сделать это вручную с помощьюcontrol-L
.Вы можете написать функцию оболочки, которая получает bash для повторной печати своего приглашения после
echo
завершения . Просто делатьecho "$PS1"
не будет воспроизводить какие-либо уже напечатанные символы.kill -WINCH $$
в моей системе получает bash для повторной печати строки подсказки без очистки экрана, оставляяhi
строку перед самой подсказкой. SIGWINCH отправляется автоматически, когда размер окна изменяется, и ответ bash на него делает то, что мы хотим.Это может работать с другими оболочками, но я не пытаюсь сделать это на 100% портативным / POSIX. ( К сожалению, это работает только на bash4.4, а не на bash4.3 или зависит от некоторых настроек, о которых я не знаю )
Вы можете легко обернуть это в функцию оболочки, которая принимает спящий аргумент и сообщение.
bash 4.3 не перепечатывает свою подсказку после SIGWINCH, поэтому там это не работает. у меня есть
shopt -s checkwinsize
включил в обеих системах, но он работает только в системе Bash 4.4 (Arch Linux).Если это не работает, вы можете попробовать
(sleep 2 && echo -e '\nhi' && echo "$PS1" &)
, что «работает», если командная строка пуста. (Это также игнорирует возможность, котораяPROMPT_COMMAND
установлена.)Нет действительно чистого способа заставить вывод терминала смешиваться с тем, что вы могли бы делать на своем терминале позже, когда срабатывает таймер. Если вы находитесь в процессе прокрутки чего-то
less
, вы можете легко пропустить это.Если вы ищете что-то с интерактивными результатами, я предлагаю воспроизвести аудиофайл. например, с помощью проигрывателя командной строки
mpv
(хороший форк MPlayer2). Или выберите видеофайл, чтобы открылось новое окно.Возможно, вы захотите
echo
открыть новый терминал xterm / konsole / gnome. Используйте опцию, которая сохраняет терминал открытым после выхода из команды.источник
Enter
нажатия клавиши, сразу после появления эха, чтобы я автоматически возвращался в основное приглашение консоли ?(sleep 2 && echo -e '\nhi' && kill -WINCH $$ &)
,kill -WINCH $$
действительно обновить приглашение оболочки , работающей в терминале. Вот и весь смысл его использования. Нажатие клавиши ввода приведет к вводу частично набранной команды, а WINCH - нет, как я показал. Если вы ничего не набрали, то вы получите пустое приглашение.rm -rf ~/some/directory
, потенциально не запустил бы Enterrm -rf ~/
. (Совет по безопасности: закончите вводить пути, а затем управляйте «а» и переходитеls
на «rm -rf
жирный ввод» в любое время, что не испортит ваш день.)(sleep 2 && echo -e '\nhi' && kill -WINCH $$ &)
и после того, как эхо появилось, я получил пустое приглашение, только после нажатияEnter
я вернулся к основному приглашению ... Извините, если я вас неправильно понял, я совсем новичок в Bash.screen
сеанса (и только через SSH) в старой системе Ubuntu, и я получил поведение, которое вы описываете.Правильным при использовании является
at <timespec>
, где<timespec>
указывается время. Вы также можете использовать-f
опцию, чтобы указать файл, содержащий команды для выполнения. Если-f
и перенаправление не используется, at будет читать команды для выполнения из стандартного ввода (стандартный ввод).В вашем примере, чтобы выполнить «некоторую команду» (я выбрал «некоторую команду» как «echo hi» в приведенном ниже примере) через одну минуту сразу после того, как вы нажали клавишу ввода (сейчас), предполагается
<timespec>
использовать ееnow + 1 minute
. Итак, чтобы получить желаемый результат с помощью однострочного решения, используйте команду ниже:echo 'echo hi' | at now + 1 minute
Это предполагается (и будет делать), чтобы запустить
echo hi
команду через одну минуту. Проблема здесь заключается в том, чтоecho hi
команда будет выполнена командой at в фиктивном tty, а выходные данные будут отправлены в почтовый ящик пользователя (если он настроен правильно - что требует более подробного объяснения о том, как настроить почтовый ящик в Unix машина и не входит в сферу этого вопроса). Суть в том, что вы не сможете напрямую увидеть результатecho hi
в том же терминале, в котором вы выполнили команду. Самый простой вариант - перенаправить его в «какой-нибудь файл», например:echo 'echo hi > /tmp/at.out' | at now + 1 minute
В приведенном выше примере «некоторый файл» есть,
/tmp/at.out
и ожидаемый результат состоит в том, что файлat.out
в / tmp создается через одну минуту и содержит текст «привет».В дополнение к
now + 1 minute
приведенному выше примеру, могут использоваться многие другие временные спецификации, даже некоторые сложные. Команда at достаточно умна, чтобы интерпретировать довольно удобочитаемые, как в примерах ниже:now + 1 day
,13:25
,mid‐night
,noon
, ...Пожалуйста, обратитесь к справочной странице для получения дополнительной информации о возможных спецификациях времени, поскольку возможные вариации довольно обширны и могут включать даты, относительное или абсолютное время и т. Д.
источник
at
по умолчанию отправляет вывод по почте, но это должно быть правильно настроено для работы.at <timespec>
и какой флаг вы использовали и подходит ли он для Ubuntu 16.04 xenial.Запустите
sleep
в подоболочке:Примечание: в Linux вы можете задать аргумент для сна в секундах или с суффиксом s / m / h / d (для секунд, минут, часов, дней). На BSD аргумент должен быть в секундах
источник
stdin
), а не в моемstdout
(как это было бы с обычнымecho
).(sleep 10s; echo 'hi') & 1>
. Я теперь читаю больше об этом.stdin
иstdout
. Они не имеют ничего общего с тем, где вещи появляются на вашем терминале; вместо этого вы должны интерпретировать их относительно определенного процесса (в основном, программы). Стандартный ввод ("stdin") для процесса - это источник, из которого процесс может читать данные, а стандартный вывод процесса ("stdout") - это место назначения, в которое он может записывать данные. Этими источниками и получателями могут быть другие программы, или файлы, или сам терминал (набираемые вами данные отправляются в stdin, и отображается все, что приходит в stdout).Это не удалось , потому что вы перенаправив вывод
echo "hi"
, который толькоhi
кat
, ноat
ожидает , что это вход может быть выполнена оболочкой системы по умолчанию (обычно Баш, но иногда что - то другое в зависимости от системы).Эта:
достигнет того, что вы, кажется, пытаетесь сделать. Он использует конструкцию оболочки, называемую «здесь документ», которая, как правило, является общепринятым способом для такого рода вещей (поскольку он обрабатывает несколько строк лучше, чем использование
echo
команды, и не требует создания нового файла, как это было бы необходимо с помощьюcat
) и переводит в несколько более сложный эквивалент, используяecho
:Вероятно, стоит отметить, что
at
любые выходные команды отправляются пользователю, который вызвалat
команду, вместо того, чтобы выводить вывод на терминал, как команда, отложенная при использованииsleep
в подоболочке. В частности, это означает, что если вы не выполнили некоторые настройки системы или не собираетесь читать локальную почтовую папку, вы не сможете получить вывод команд, запущенных черезat
.источник
syntax error. Last token seen: m Garbled time
. Понятия не имею почему. Я использую Ubuntu 16.04, Bash 4.0. Может быть, вы сделали это в другой системе. Даже когда я печатаюat
без каких-либо дополнительных аргументов, я все равно получаю ту же ошибку. Больше данных здесь .at 1m
не работает для posix-совместимыхat
.at now + 1 minute
at
, я просто предполагал, что у вас есть версия, которая принимает этот синтаксис.at 1m
не является POSIX, но POSIX-совместимые реализацииat
могут свободно интерпретировать его так, как они хотят, это не делаетat
реализацию менее совместимой, чтобы интерпретировать ее как значение, аналогичноеnow + 1 minute
возврату ошибки или значения месяц назад . IOW, этоat 1m
код, который не POSIX.Объедините ответ @Peter Cordes и этот ответ /programming/23125527/how-to-return-to-bash-prompt-after-printing-output-from-backgounded-function/23125687#23125687
Код ниже взят из последнего ответа, с небольшим изменением моего. Скомпилируйте его в файл a.out (как вам угодно)
Затем выполните команду ниже. (Я помещаю a.out в dir / tmp /, возможно, вам придется перейти на ваш)
или
Кстати,
kill -WINCH $$
у меня отлично работает с Bash 4.3 на Gentoo.источник
Основываясь на ответах выше, вы можете сделать так, чтобы встроенная команда направляла свой вывод на ваш терминал, например так:
echo "echo hi >$(tty); kill -WINCH $$" | at now + 1 minute
Команда
tty
возвращает путь к устройству вашего текущего терминала, заключив его в$(...)
bash, выполнив его в под-оболочке, и команда kill отправляет сигнал текущему процессу, который bash перепечатает приглашение $ PS1.источник