read
, por padrão, lê palavras de sua entrada em variáveis .
'cmd'
, a forma antiga de $(...)
captura a saída de um comando. Por padrão, read
não produz saída. O texto que você vê quando digita algo para ser lido por read
é o echo do dispositivo terminal, não é emitido por read
¹.
Algumas implementações read
podem produzir o que lêem. Por exemplo, zsh
' read
builtin pode fazer isso com -e
ou -E
(este último também armazena a entrada em variáveis além de ecoar de volta).
Então, em zsh
:
echo "my name is=$(read -e) and am from $(read -e)"
Portavelmente, você pode ler uma linha de entrada (em oposição a o comportamento de leitura especial de read
) e enviá-la de volta com head -n1
. No entanto, observe que, se a entrada padrão não for um dispositivo de terminal ou um arquivo pesquisável, a maioria das implementações de head
lerá mais de uma linha.
Muitos sistemas ainda têm um comando line
para isso (costumava ser padrão, mais tarde depreciado).
echo "my name is=$(line) and am from $(line)"
Que deve ler um byte de cada vez, portanto, não leia mais de uma linha de entrada.
Se não estiver disponível, você pode sempre emular esse line
com read
:
line() {
IFS= read -r line
ret=$?
printf '%s\n' "$line" || return "$ret"
}
Ou até mesmo torná-lo
prompt() {
printf >&2 %s "$1"
IFS= read -r answer
printf '%s\n' "$answer"
}
printf '%s\n' "my name is=$(
prompt "What is your name? ") and am from $(
prompt "Where are you from? ")"
(usando aqui printf
em vez de echo
como echo
geralmente não pode ser usado para dados arbitrários ).
(o mesmo que zsh
' IFS= read -re '?What is your name? '
).
Para completar, com csh
ou tcsh
, você pode fazer:
printf '%s\n' "my name is=$< and am from $<"
$<
sendo o caminho do csh para ler a entrada em uma variável.
Se você quisesse repetir isso para cada duas linhas de entrada, seria melhor usar um utilitário de processamento de texto como awk
:
awk '{name=$0; getline place; print "my name is="name" and am from "place}'
¹ a menos que read
esteja configurado para implementar um editor de linhas sozinho, como com read -e
in bash
ou definindo a opção emacs
, gmacs
ou vi
em ksh93
(e stdin is um dispositivo de terminal), mas read
produziria o echo no stderr, não o stdout.