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.