Se você quiser preencher previamente o conteúdo no editor, escreva esse conteúdo inicial no arquivo, exatamente como você pensou.
Não há como "colocar o editor no estado em que ele estaria se você digitasse algumas linhas depois de abri-lo", o que funciona em diversos editores. Em muitos editores, isso significa que o arquivo não será salvo, mas não há uma maneira uniforme de atingir esse estado, e há editores que não possuem esse conceito (por exemplo, Scratch ).
Você pode, no entanto, detectar se o arquivo foi salvo do editor. Abandone a operação se o arquivo não foi salvo. Para detectar se o arquivo foi salvo, verifique seu tempo de modificação antes e depois.
file=$(mktemp)
cat <<EOF >"$file"
Hello
world
EOF
old_metadata=$(ls -li "$file")
"${VISUAL:-"${EDITOR:-vi}"}" "$file"
new_metadata=$(ls -li "$file")
if [ "$new_metadata" = "$old_metadata" ]; then
… # unchanged file, abandon operation
else
… # modified file, carry on
fi
Tenha em atenção que, se o ficheiro foi modificado, mas o tamanho e o inode não se alteraram e a modificação demorou menos de 1 segundo, este script irá pensar que o ficheiro não foi modificado. Isso não acontecerá se um ser humano estiver editando, mas pode acontecer facilmente se $EDITOR
for um script que envie um arquivo modificado automaticamente. É difícil fazer melhor de maneira portátil. Com o GNU coreutils, passar a opção --full-time
para ls
resolve este problema se o sistema de arquivos suportar timestamps de subsegundos com precisão suficiente.
Como alternativa, verifique se o arquivo foi modificado. A maneira mais fácil de fazer isso é manter uma cópia do conteúdo inicial e chamar cmp
. Se comandos como sha256sum
ou sha
estiverem disponíveis, você poderá usá-los e comparar os hashes antes e depois. Talvez você ainda queira considerar que o arquivo tenha sido editado se o registro de data e hora tiver mudado - talvez o usuário tenha querido enviar a entrada padrão.
Essa técnica é o que vários sistemas de controle de versão usam quando iniciam um editor para editar uma mensagem de confirmação. Se o usuário não salvar o arquivo, a confirmação será cancelada.
Se você também quiser posicionar o cursor no final da entrada, não há uma maneira universal de fazer isso. Com muitos editores, você pode escrever
"$EDITOR" +"$line" "$file"
e o editor será aberto com o cursor na linha especificada. Isto é suportado por muitos editores incluindo vi (todas as variantes), emacs, joe e gedit, mas não pelo kwrite.