Luồng "hi" được in trong lời nhắc của tôi (trong phần stdin
) và không phải trongstdout
Không, nó không phải là "in trong của bạn stdin
".
Nếu bạn nhấn return, nó sẽ không chạy hi
như một lệnh. Chỉ là nền tảngecho
được in hi
trong khi con trỏ theo dấu nhắc của bạn.
Có lẽ bạn muốn in một dòng mới hàng đầu , như(sleep 1m && echo -e '\nhi' &)
. (Điều chỉnh khi cần thiết cho echo
vỏ của bạn. Hoặc sử dụng printf
cho tính di động.)
Tôi đặt phần &
bên trong lớp con để "từ chối" công việc nền, vì vậy bạn cũng tránh được "tiếng ồn" [1]+ Done
. Với &&
giữa các lệnh, &
áp dụng cho toàn bộ chuỗi lệnh ghép, do đó, nó sẽ quay trở lại dấu nhắc shell ngay lập tức thay vì chờ sleep
thoát như bạn nhận được với(sleep 1; echo ... &)
Đây là những gì xảy ra (với độ trễ 1 giây):
peter@volta:~$ (sleep 1 && echo -e '\nhi' &)
peter@volta:~$
hi
# cursor is at the start of this empty line.
Bash không biết rằng đã echo
in một cái gì đó, vì vậy nó không biết nó cần in lại lời nhắc của nó hoặc làm sạch màn hình. Bạn có thể làm điều đó bằng tay với control-L
.
Bạn có thể viết một hàm shell được bash để in lại dấu nhắc của nó sau khi echo
kết thúc . Chỉ cần làm echo "$PS1"
sẽ không tái tạo bất kỳ nhân vật đã gõ. kill -WINCH $$
trên hệ thống của tôi được bash để in lại dòng nhắc của nó mà không xóa màn hình, để lại hi
một dòng trước dấu nhắc. SIGWINCH được gửi tự động khi kích thước WINdow thay đổi và phản ứng của bash đối với nó xảy ra để làm những gì chúng ta muốn.
Nó có thể hoạt động với các shell khác, nhưng tôi không cố gắng thực hiện 100% xách tay / POSIX này. ( Thật không may, điều này chỉ hoạt động trên bash4.4, không phải bash4.3 hoặc phụ thuộc vào một số cài đặt mà tôi không biết )
# 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`
Bạn có thể dễ dàng gói nó trong một hàm shell có chức năng ngủ và tin nhắn.
bash 4.3 không in lại lời nhắc của nó sau SIGWINCH, vì vậy điều này không hoạt động ở đó. Tôi cóshopt -s checkwinsize
kích hoạt trên cả hai hệ thống, nhưng nó chỉ hoạt động trên hệ thống Bash 4.4 (Arch Linux).
Nếu nó không hoạt động, bạn có thể thử (sleep 2 && echo -e '\nhi' && echo "$PS1" &)
, "hoạt động" nếu dòng lệnh trống. (Nó cũng bỏ qua khả năng PROMPT_COMMAND
được đặt.)
Không có cách nào thực sự sạch để có được đầu ra đầu cuối để trộn với bất cứ điều gì bạn có thể làm trên thiết bị đầu cuối của mình sau đó, khi bộ hẹn giờ kích hoạt. Nếu bạn đang ở giữa cuộn một cái gì đó trongless
, bạn có thể dễ dàng bỏ lỡ nó.
Nếu bạn đang tìm kiếm thứ gì đó có kết quả tương tác, tôi khuyên bạn nên phát tệp âm thanh. ví dụ với một trình phát dòng lệnh như mpv
(fork đẹp của MPlayer2). Hoặc chọn một tệp video để một cửa sổ mới mở ra.
(sleep 1 && mpv /f/share/music/.../foo.ogg </dev/null &>/dev/null &)
Bạn có thể muốn echo
mở một xterm / konsole / gnome-terminal mới. Sử dụng một tùy chọn giữ cho thiết bị đầu cuối mở sau khi thoát lệnh.