Потік "привіт" друкується в моєму підказці (в stdin
), а не в моємуstdout
Ні, це не "надруковано у вашому stdin
".
Якщо ви натиснули return, він не намагатиметься запустити hi
як команду. Це просто те, що фонове зображення echo
друкувалося, hi
поки курсор був після вашого запиту.
Можливо, ви хочете надрукувати провідний новий рядок , наприклад (sleep 1m && echo -e '\nhi' &)
. (Налаштуйте за необхідності для echo
вашої оболонки. Або використовуйте printf
для перенесення.)
Я поміщаю &
всередину нижньої частини корпусу, щоб "відхилити" фонове завдання, щоб ви також уникали "шуму" [1]+ Done
. З &&
командами, що &
застосовується , застосовується до всього ланцюжка складових команд, тому він повертається до підказки оболонки одразу замість того, щоб чекати sleep
виходу, як ви отримаєте з(sleep 1; echo ... &)
Ось що відбувається (із затримкою на 1 секунду):
peter@volta:~$ (sleep 1 && echo -e '\nhi' &)
peter@volta:~$
hi
# cursor is at the start of this empty line.
Bash не знає, що echo
щось надрукував, тому не знає, що йому потрібно повторно надрукувати своє запит або очистити екран. Це можна зробити вручну за допомогою control-L
.
Ви можете написати функцію оболонки, яка отримує bash для повторного друку її підказки після echo
закінчення . Просто виконання echo "$PS1"
не відтворює жодних вже введених символів. kill -WINCH $$
в моїй системі отримує bash, щоб повторно надрукувати рядок підказок, не очищаючи екран, залишаючи hi
на рядку сам перед запитом. SIGWINCH надсилається автоматично, коли зміни розміру WINdow, і відповідь Баша на нього трапляється робити те, що ми хочемо.
Це може працювати з іншими оболонками, але я не намагаюся зробити цей 100% портативний / POSIX. ( На жаль, це працює лише на bash4.4, а не bash4.3, або залежить від деяких налаштувань, про які я не знаю )
# bash4.4
peter@volta:~$ (sleep 2 && echo -e '\nhi' && kill -WINCH $$ &)
peter@volta:~$ ljlksjksajflasdf dfas # typed in 2 seconds
hi
peter@volta:~$ ljlksjksajflasdf dfas # reprinted by Bash because of `kill -WINCH`
Ви можете легко зафіксувати це у функції оболонки, яка сприймає аргумент сну та повідомлення.
bash 4.3 не повторно друкує своє запит після SIGWINCH, тому це не працює. Я shopt -s checkwinsize
ввімкнув обидві системи, але він працює лише в системі Bash 4.4 (Arch Linux).
Якщо це не працює, ви можете спробувати (sleep 2 && echo -e '\nhi' && echo "$PS1" &)
, що "працює", якщо командний рядок порожній. (Він також ігнорує встановлену можливість PROMPT_COMMAND
.)
Немає дійсно чистого способу отримати термінальний вихід, щоб змішатись із тим, що ви могли б робити на своєму терміналі пізніше, коли таймер спрацює. Якщо ви посередині щось прокручуєте less
, ви легко можете пропустити це.
Якщо ви шукаєте щось із інтерактивними результатами, пропоную відтворити аудіофайл. наприклад, з програвачем командного рядка типу mpv
(приємна форка MPlayer2). Або виберіть відеофайл, щоб відкрилося нове вікно.
(sleep 1 && mpv /f/share/music/.../foo.ogg </dev/null &>/dev/null &)
Ви можете echo
відкрити новий xterm / konsole / gnome-термінал. Використовуйте опцію, яка зберігає термінал відкритим після завершення команди.