Eu não acho que o que você está pedindo é possível. Ao usar read
, você só tem acesso a capacidades mínimas de edição de texto, simplesmente não é projetado para o que você deseja fazer. Mesmo se você puder encontrar uma maneira de permitir backspace e novas linhas, ainda é uma maneira muito complicada de solicitar que seus usuários forneçam informações. É muito raro esperar que seus usuários digitem texto diretamente no programa em execução. Sugiro uma alternativa:
- Peça ao seu script para ler o assunto na linha de comando.
- Ele leu o corpo de um arquivo de entrada.
Dessa forma, seu usuário não precisa digitar tudo manualmente, seu script pode ser automatizado para enviar vários e-mails, aumentando muito sua utilidade e seus usuários não precisam começar tudo de novo do zero se fizerem um erro de digitação . Finalmente, eles podem formatar o corpo do email como desejarem. Então, por exemplo, você pode fazer algo assim:
#!/bin/bash
## Parse command line options.
while getopts ":s:f:" opt; do
case $opt in
s)
subject="$OPTARG"
;;
f)
file="$OPTARG"
## Exit if the file isn't a file or isn't readble
if [[ ! -r "$file" && ! -f "$file" ]]; then
echo "File doesn't exist or isn't readble"
exit
fi
;;
\?)
echo "Invalid option: -$OPTARG" >&2;;
esac
done
## Read the email body
body=$(cat "$file")
## Inform the user. The "3[1m" starts bold formatting and the
## "3[0m" ends it. Remove them if you don't want bold.
echo -e "3[1mYour message is as follows:3[0m"
cat<<EoF
From: $USER
To: Administrator
Subject: $subject
$body
------------------
EoF
read -p "Send to Administrator (y/n)?" choice
case "$choice" in
y|Y ) echo "$body" | mail -s "$subject" [email protected];;
n|N ) echo "Roger Dodger. Email canceled";;
* ) echo "invalid";;
esac
Em seguida, você indica o assunto e um arquivo de entrada. Por exemplo, se você tiver um arquivo chamado message
com o seguinte conteúdo:
$ cat message
Dear John,
I hope this email finds you well. I am writing to inquire about the
price of the bridge you are selling. I would love to have a bridge
like that in my garden since I think it would make my cows look
larger.
Looking forward to hearing from you,
best,
Jack.
Você executaria o script assim:
$ foo.sh -s "about that bridge..." -f message
Your message is as follows:
From: terdon
To: Administrator
Subject: about that bridge...
Dear John,
I hope this email finds you well. I am writing to inquire about the
price of the bridge you are selling. I would love to have a bridge
like that in my garden since I think it would make my cows look
larger.
Looking forward to hearing from you,
best,
Jack.
------------------
Send to Administrator (y/n)?
Como alternativa, se você insistir em que os usuários gravem a mensagem na hora, você poderá usar o editor padrão disponível em seu sistema:
#!/bin/bash
clear
echo -e "Please Enter Subject of email:\n "
read subject
## create a temp file
tmpfile=$(mktemp)
cat<<EoF
Press Enter to open an editor where you can write the body of the email.
When finished, save and exit.
EoF
read
## Open the editor
"$EDITOR" "$tmpfile"
## Read the body and delete the tmp file
body=$(cat "$tmpfile")
rm "$tmpfile"
## Inform the user. The "3[1m" starts bold formatting and the
## "3[0m" ends it. Remove them if you don't want bold.
echo -e "3[1mYour message is as follows:3[0m"
cat<<EoF
From: $USER
To: Administrator
Subject: $subject
$body
EoF
read -p "Send to Administrator (y/n)?" choice
case "$choice" in
y|Y ) echo "$body" | mail -s "$subject" [email protected];;
n|N ) echo "Roger Dodger. Email canceled";;
* ) echo "invalid";;
esac
Finalmente, se você insistir em tornar sua vida e a de seus usuários mais difícil do que precisa, você pode usar cat > $tmpfile
para gravar o corpo no tmpfile, dizer aos seus usuários para pressionar Ctrl + D quando terminarem de escrever:
#!/bin/bash
clear
echo -e "Please Enter Subject of email:\n "
read subject
## create a temp file
tmpfile=$(mktemp)
## Enter the body
printf '\nPlease enter the body of the email below. Hit Ctrl+D when done.\n\n'
cat > $tmpfile
body=$(cat "$tmpfile")
rm "$tmpfile"
## Inform the user. The "3[1m" starts bold formatting and the
## "3[0m" ends it. Remove them if you don't want bold.
echo -e "3[1mYour message is as follows:3[0m"
cat<<EoF
From: $USER
To: Administrator
Subject: $subject
$body
EoF
read -p "Send to Administrator (y/n)?" choice
case "$choice" in
y|Y ) echo "$body" | mail -s "$subject" [email protected];;
n|N ) echo "Roger Dodger. Email canceled";;
* ) echo "invalid";;
esac