Linux Bash Shell do odczytu z obsługą kart (\ t)

Oct 16 2020

Istnieje \topcja zakładki poziomej wecho

wolf@linux:~$ echo hello hello wolf@linux:~$ 

wolf@linux:~$ echo -e '\thello' hello wolf@linux:~$ 

Czy jest jakaś podobna opcja read?

wolf@linux:~$ read -p 'hello ' hello wolf wolf@linux:~$ 
wolf@linux:~$ read -p '\thello ' \thello wolf wolf@linux:~$ 

Pożądane wyjście

wolf@linux:~$ read -p '\thello ' <- need something to produce something like tab or `\t` in `echo` hello wolf wolf@linux:~$ 

Odpowiedzi

6 StéphaneChazelas Oct 15 2020 at 23:03

Zawsze możesz użyć cytatów w stylu ksh93, $'...'które rozumieją te sekwencje specjalne:

IFS= read -r -p $'\thello ' var

( IFS=i -rnie są istotne, po prostu dodaję je tutaj, ponieważ dzwonienie readbez nich rzadko ma sens).

Zauważ, że -pnie jest to standardowa shfunkcja. W ksh / zsh, -pczyta z koprocesu, a podpowiedzi są określane za pomocą read 'var?Prompt: '. Szkoda, że bashzdecydowaliśmy się wprowadzić tutaj niezgodny interfejs API. Nie musisz jednak używać -p, możesz po prostu zrobić przenośnie:

printf >&2 '\thello '
IFS= read -r var

printfrozpoznaje te sekwencje ucieczki w swoim argumencie format i argumenty dla %bspecyfikatorów. To, czy echoje rozpoznaje (lub akceptuje -eopcję ich rozpoznania), zależy od implementacji i dla wielu implementacji (w tym bashwbudowanych) od czasu kompilacji i ustawień czasu wykonania, więc najlepiej tego unikać .

terdon Oct 15 2020 at 23:02

Zawsze możesz po prostu dodać 8 spacji:

read -p '        hello '

Ale tak, możesz również uzyskać rzeczywisty znak tabulacji:

read -p $'\t''hello '

Lub

read -p "$(echo -e '\thello ')"

Lub

read -p "$(printf '\thello ')"