Strumień „cześć” jest drukowany w moim monicie (w stdin
), a nie w moimstdout
Nie, nie jest to „wydrukowane na twoim stdin
”.
Jeśli naciśniesz klawisz Return, nie będzie próbował uruchomić się hi
jako polecenie. Tyle tylko, że tło echo
drukowane było, hi
gdy kursor znajdował się za twoim monitem.
Być może chcesz wydrukować wiodący nowy wiersz , na przykład (sleep 1m && echo -e '\nhi' &)
. (Dostosuj odpowiednio do echo
powłoki. Lub użyj printf
dla przenośności.)
Umieszczam &
wnętrze podpowłoki, aby „wyłączyć” zadanie w tle, abyś także unikał „szumu” [1]+ Done
. Z &&
pomiędzy poleceniami, &
odnosi się do całego łańcucha związek-polecenia, więc wraca do powłoki wiersza od razu, zamiast czekać na sleep
do wyjścia jak dałaby(sleep 1; echo ... &)
Oto, co się stanie (z 1-sekundowym opóźnieniem):
peter@volta:~$ (sleep 1 && echo -e '\nhi' &)
peter@volta:~$
hi
# cursor is at the start of this empty line.
Bash nie wie, że echo
coś wydrukował, więc nie wie, że musi ponownie wydrukować monit lub wyczyścić ekran. Możesz to zrobić ręcznie za pomocą control-L
.
Możesz napisać funkcję powłoki, która pobiera bash, aby ponownie wydrukować monit po echo
zakończeniu . Samo działanie echo "$PS1"
nie odtworzy już wpisanych znaków. kill -WINCH $$
w moim systemie pojawia się bash, aby ponownie wydrukować wiersz zachęty bez czyszczenia ekranu, pozostawiając hi
wiersz sam przed monitem. SIGWINCH jest wysyłany automatycznie, gdy zmienia się rozmiar okna WINDow, a reakcja bash na to dzieje się tak, jak chcemy.
Może działać z innymi powłokami, ale nie próbuję uczynić tego w 100% przenośnym / POSIX. ( Niestety działa to tylko na bash4.4, nie na bash4.3 lub zależy od niektórych ustawień, których nie znam )
# 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`
Można to łatwo zawinąć w funkcję powłoki, która pobiera argument uśpienia i komunikat.
bash 4.3 nie drukuje ponownie swojego monitu po SIGWINCH, więc to nie działa. Mam shopt -s checkwinsize
włączone na obu systemach, ale działa tylko w systemie Bash 4.4 (Arch Linux).
Jeśli to nie działa, możesz spróbować (sleep 2 && echo -e '\nhi' && echo "$PS1" &)
, który „działa”, jeśli wiersz poleceń jest pusty. (Ignoruje również ustawioną możliwość PROMPT_COMMAND
).
Nie ma naprawdę czystego sposobu na zmiksowanie wyjścia terminala z tym, co możesz zrobić na swoim terminalu później, gdy zadziała timer. Jeśli jesteś w trakcie przewijania czegoś less
, możesz łatwo tego przegapić.
Jeśli szukasz czegoś z interaktywnymi wynikami, sugeruję odtworzenie pliku audio. np. z odtwarzaczem wiersza poleceń, takim jak mpv
(fajny fork MPlayera2). Lub wybierz plik wideo, aby otworzyć nowe okno.
(sleep 1 && mpv /f/share/music/.../foo.ogg </dev/null &>/dev/null &)
Możesz chcieć echo
otworzyć swój nowy xterm / konsole / gnome-terminal. Użyj opcji, która utrzymuje terminal otwarty po wyjściu polecenia.