Tôi đang in một tin nhắn trong tập lệnh Bash và tôi muốn tô màu một phần của nó; ví dụ,
#!/bin/bash
normal='\e[0m'
yellow='\e[33m'
cat <<- EOF
${yellow}Warning:${normal} This script repo is currently located in:
[ more messages... ]
EOF
Nhưng khi tôi chạy trong thiết bị đầu cuối ( tmux
bên trong gnome-terminal
), các ký tự thoát ANSI chỉ được in \
dưới dạng; ví dụ,
\e[33mWarning\e[0m This scr....
Nếu tôi di chuyển phần tôi muốn chuyển sang một printf
lệnh bên ngoài tài liệu ở đây, nó sẽ hoạt động. Ví dụ, điều này hoạt động:
printf "${yellow}Warning:${normal}"
cat <<- EOF
This script repo is currently located in:
[ more messages... ]
EOF
Từ man bash
- Tại đây Tài liệu:
Không có mở rộng tham số và biến, thay thế lệnh, mở rộng số học hoặc mở rộng tên đường dẫn được thực hiện trên word . Nếu bất kỳ ký tự nào trong từ được trích dẫn, dấu phân cách là kết quả của việc loại bỏ trích dẫn trên từ và các dòng trong tài liệu ở đây không được mở rộng. Nếu từ không được trích dẫn, tất cả các dòng của tài liệu ở đây phải chịu sự mở rộng tham số, thay thế lệnh và mở rộng số học. Trong trường hợp sau, chuỗi ký tự \ <xuống dòng> bị bỏ qua, và
\
phải được sử dụng để trích dẫn các nhân vật\
,$
và`
.
Tôi không thể tìm hiểu làm thế nào điều này sẽ ảnh hưởng đến mã thoát ANSI. Có thể sử dụng mã thoát ANSI trong tài liệu Bash ở đây cat
không?
yellow=$'\e[33m'
hoặc yellow=$(printf '\e[33m')
(như bạn đã làm) sẽ đưa ký tự thoát vào chuỗi trực tiếp để kiểm tra.
'\e[33m'
này là vô nghĩa đối với một thiết bị đầu cuối? nó chỉ có ý nghĩa đối với các lệnh như echo -e
hoặc printf
- sau đó tạo ra mã "thực" được gửi đến thiết bị đầu cuối?
\e[33m
và được thay thế bình thường trong cả hai trường hợp. Nếu bạn có một số lý do để nghĩ rằng nó bị giới hạn trong heredocs hoặc một chút mã thực sự thể hiện hành vi mà bạn quan tâm, vui lòng chỉnh sửa nó.