Có rất nhiều cách để làm điều này. Hai thiết bị di động nhất mà tôi biết là sedvà od- cả hai đều là POSIX.
printf '\n\r\b\t\033[01;31m' | sed -n l
Nó không thích ... readthoát kiểu - kiểu C.
ĐẦU RA
$
\r\b\t\033[01;31m$
od cấu hình hơn một chút ...
printf '\n\r\b\t\033[01;31m' |
od -v -w12 -t c -t a -A n
\n \r \b \t 033 [ 0 1 ; 3 1 m
nl cr bs ht esc [ 0 1 ; 3 1 m
Nếu bạn muốn biết tất cả các tùy chọn đó bạn có thể xem trong đó man od, nhưng tôi chỉ định tôi muốn có hai loại thoát - -t cdấu gạch chéo ngược thoát và -t aký tự được đặt tên. Các -wtùy chọn sử dụng trên không phải là POSIX chỉ định.
Và đây là một hàm shell nhỏ có thể in ra các giá trị bát phân của từng byte trong các đối số của nó - tất nhiên, odcó thể xử lý tốt như -t osau:
proctal() (LC_ALL=C
for a do while [ -n "$a" ]
do printf %o\\n "'$a"
a=${a#?}; done; done)
Đó là một điều đơn giản. Điều này phức tạp hơn một chút. Nó sẽ có thể làm những gì các printf -qtriển khai cụ thể vỏ có thể, mặc dù.
bsq() (set -f; export LC_ALL=C IFS=\'
for a do q=${a##*\'}; printf \'
[ -n "${a#"$q"}" ] &&
printf "%s'\''" ${a%\'*}
printf "%s'\n'''''\n" "$q"; done |
sed -n "/'''''"'/!H;1h;//!d;$!n;x;l' |
sed -e :n -e '/\\$/N;s/.\n//;tn
s/\([^\\]\\\(\\\\\)*\)\([0-9]\)/\10\3/g
s/\\\\'"''/\\\\''"'/g;s/$$//'
)
Sử dụng chuỗi ví dụ từ trước đó với một chút bổ sung:
bsq "$(printf '\n\r\'\''b\t\033[01;31m')"
ĐẦU RA
'\n\r\\'\''b\t\0033[01;31m'
Nó chỉ hơi khác một chút. Bạn có thể nhận thấy có thêm 0một \backslash. Điều này là để cho phép dễ dàng dịch sang một readhoặc một %b printfđối số. Ví dụ:
i=0
until [ $((i=$i+1)) -gt 5 ]
do touch "\%$i$(printf 'hey\b \t;\n\033 ')"
done #just for ugly's sake
bsq * | eval "
printf '<%b>\n' $(tr \\n \ )
" | tee /dev/fd/2 |
sed -n l
ĐẦU RA
<\%1he ;
>
<\%2he ;
>
<\%3he ;
>
<\%4he ;
>
<\%5he ;
>
<\\%1hey\b \t;$
\033 >$
<\\%2hey\b \t;$
\033 >$
<\\%3hey\b \t;$
\033 >$
<\\%4hey\b \t;$
\033 >$
<\\%5hey\b \t;$
\033 >$