Hầu hết thời gian đầu ra của một lệnh kết thúc bằng ký tự dòng mới. Nhưng đôi khi không, vì vậy dấu nhắc shell tiếp theo được in cùng dòng với đầu ra.
Thí dụ:
root @ tên máy chủ [~] # echo -n xin chào
helloroot @ tên máy chủ [~] #
Tôi luôn thấy điều đó thật khó chịu.
Bây giờ, tôi chỉ có thể thêm "\ n" vào đầu biến PS1, nhưng hầu hết thời gian sẽ in thêm một dòng tôi không cần.
Có thể biết liệu đầu ra của lệnh cuối cùng kết thúc với một dòng mới hay không?
Giải pháp:
(Cảm ơn Dennis)
PS1='$(printf "%$((`tput cols`-1))s\r")\u@\h [\w]\$ '
$()
ở một nơi và backticks ở một nơi khác. Bạn có thể sử dụng $()
trong cả hai.
tput cols
bởi vì dù sao nó cũng chỉ xuất ra giá trị của biến COLUMNS và nó chậm hơn vì nó không phải là vỏ dựng sẵn. Bạn cũng sẽ muốn bao gồm \e[K
(tương đương tput el
) để xóa khoảng trắng được chèn để bạn không nhận được một khoảng trắng theo sau khi sao chép và dán trong trường hợp mặc định. Cuối cùng, bạn cần kèm theo tất cả phép thuật này giữa \[
và \]
nếu không, bash sẽ cố gắng đoán thứ hai vị trí con trỏ của bạn và nó sẽ gây rối khi bạn chỉnh sửa lệnh / lịch sử của mình.
PS1='\[\e[7m%\e[m$( printf "%*s" "$((COLUMNS-1))" "" )\r\e[K\]\u@\h [\w]\$ '