Linux Bash Shell lu avec prise en charge des onglets (\ t)

Oct 16 2020

Il existe une \toption pour l'onglet horizontal dansecho

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

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

Existe-t-il une option similaire read?

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

Sortie désirée

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

Réponses

6 StéphaneChazelas Oct 15 2020 at 23:03

Vous pouvez toujours utiliser la $'...'forme de guillemets de style ksh93 qui comprend ces séquences d'échappement:

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

(les IFS=et -rne sont pas pertinents, je les ajoute simplement ici car appeler readsans eux a rarement du sens).

Notez que ce -pn'est pas une shfonction standard . Dans ksh / zsh, -pest de lire à partir du co-processus et les invites sont spécifiées avec read 'var?Prompt: '. C'est dommage que vous ayez bashchoisi d'introduire ici une API incompatible. Vous n'êtes pas obligé d'utiliser -p, vous pouvez simplement le faire de manière portative:

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

printfreconnaît ces séquences d'échappement dans son argument de format et les arguments des %bspécificateurs. Le fait de les echoreconnaître (ou d'accepter une -eoption pour les reconnaître) dépend de l'implémentation et pour de nombreuses implémentations (y compris celles bashintégrées) du temps de construction et des paramètres d'exécution, il est donc préférable d'éviter .

terdon Oct 15 2020 at 23:02

Vous pouvez toujours simplement ajouter 8 espaces:

read -p '        hello '

Mais oui, vous pouvez également obtenir un caractère de tabulation réel:

read -p $'\t''hello '

Ou

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

Ou

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