O recuo pobre e o layout do seu script atrapalham a pergunta, mas a resposta básica é
printf '%s|%s|%s|%s\n' "$(field1)" "$(field2)" "$(field3") "$(field4)"
Refatorado para isso, e com recuo etc. limpo, seu script se torna
#!/bin/bash
host(){
hostname
}
protocol(){
# avoid useless use of cat; get rid of unused parameter
# ... do you need sudo here too?
grep Protocol /etc/ssh/sshd_config
}
rootlogin(){
# straighten out massive spaghetti pretzel; remove unused parameter
# ... can you avoid sudo cat here?
if sudo cat /etc/ssh/sshd_config |
grep -v "#PermitRootLogin yes" |
grep -i -q "PermitRootLogin yes"
then
# Fix quoting
echo "$host"
else
echo "Root Access Denied"
fi
}
printf '%s|%s|%s|%s\n' "$1" "$(host)" "$(protocol)" "$(rootlogin)" >fonk.out
A última linha é um pouco especulativa; seu script atual parece não imprimir o primeiro campo, e não está claro o que deve conter.
Isso não usa mais um arquivo temporário, mas um antipadrão na sua tentativa era criar o arquivo temporário em uma função não relacionada. Quando você realmente precisa de um arquivo temporário, provavelmente seria uma boa ideia criá-lo separadamente e usá-lo como um parâmetro em qualquer lugar. Como
tmp=$(mktemp) || exit
# arrange for temp file to be removed in case of errors or signals, too
trap 'rm -f "$tmp"' EXIT
trap 'exit' ERROR HUP QUIT TRAP TERM
function1 "$tmp"
function2 "$tmp"
: etc