Comment puis-je écho directement sur la sortie standard à l'intérieur d'une fonction shell?
J'ai, dans mon script shell une fonction qui affiche un message sur la console. Elle peut être appelée à partir de n'importe quelle autre fonction.
function print_message
{
echo "message content"
}
Le problème est, en coquille, les fonctions comme echo
ou printf
que généralement les données d'impression sur la sortie standard, de rediriger leurs messages à la fonction d'appel plutôt que comme une valeur de retour.
return_value=$(print_message) # this line print nothing.
echo $return_value # This line print the message. I don't want to have to do it.
Je voudrais éviter ce problème et de les imprimer directement sur standard ou d'erreur de sortie. Est-il un moyen de le faire?
Ou suis-je eu tort de vouloir utiliser les fonctions du shell, et dois-je utiliser à la place une énorme script pour gérer n'importe quel comportement?
Vous voulez la sortie de
Des sons comme ils le veulent sur le standard et erreur standard. STDOUT, de sorte qu'il est capturé par
Qui fonctionne pour erreur standard, mais est-il un moyen d'imprimer sur la sortie standard ?
Le
print_message
pour aller à la norme de l'erreur? Toujours? Redirection dans la fonction echo "message content" >&2
.Des sons comme ils le veulent sur le standard et erreur standard. STDOUT, de sorte qu'il est capturé par
$( ... )
et STDERR de sorte qu'il s'affiche sur l'écran.Qui fonctionne pour erreur standard, mais est-il un moyen d'imprimer sur la sortie standard ?
>&1
ne semble pas fonctionner.Le
$(...)
syntaxe est capture sortie standard. C'est là que votre problème vient de la première place. C'est ce qu'il fait. Vous ne pouvez pas avoir votre sortie de fonction à certains sortie standard que le reste de ce que vous appelez dans le $(...)
contexte autre que l'utilisation de l'erreur standard et/ou de détecter et d'impression à l'ats/etc. directement.OriginalL'auteur Aracthor | 2015-07-27
Vous devez vous connecter pour publier un commentaire.
La
$(...)
syntaxe d'appel des captures de sortie standard. C'est son travail. C'est ce qu'il fait.Si vous voulez statique des messages qui ne sont pas rattrapés par cela, alors vous pouvez utiliser le standard d'erreur (bien que ne pas le faire pour des choses qui ne sont pas de message d'erreur ou de messages de débogage, etc. s'il vous plaît).
Vous ne pouvez pas avoir une fonction qui affiche sur la sortie standard, mais qui ne veut pas se faire attraper par le
$(...)
contexte, il est en cours d'exécution, car il n'y a qu'un flux de sortie standard. Le meilleur que vous pourriez faire pour ce qui serait de détecter si vous avez un terminal de contrôle/etc. et d'écrire directement à la place (mais je préfère conseiller de ne pas faire que la plupart du temps).Pour rediriger les erreurs standard pour la fonction entièrement, vous pouvez faire l'une de ces.
ou
La différence est négligeable lorsqu'il y a une seule ligne de production, mais si il y a plusieurs lignes de sortie, celle-ci est susceptible d'être légèrement plus optimisé (en particulier lorsque le flux de sortie est un fichier).
Également d'éviter la
function
mot-clé n'est pas POSIX/spec et n'est pas aussi largement portable.OriginalL'auteur Etan Reisner
Vous sont explicitement l'expression "ne pas imprimer directement le résultat! Le mettre dans une variable afin que je puisse l'imprimer moi-même!".
Vous pouvez simplement arrêter de le faire, et le message sera automatiquement imprimé:
Qu'entendez-vous par ", Vous pouvez tout simplement pas faire ça"?
pouvez tout simplement arrêter de faire ça"
OriginalL'auteur that other guy
Invoquant print_message à l'intérieur de $(...) redirige la sortie. Si vous ne voulez pas la sortie redirigé ensuite invoquer la commande sans le $(...). E. g.
Note, la valeur de retour de la fonction que vous avez fournies seront désormais le nom de la fonction.
print_message
à tous. Cette impression seraprint_message
comme un résultat de laecho
ligne.Il fonctionne pour moi et ce que je suis à lire en ligne dit que vous ne devez entrer le nom de la fonction à appeler. Par exemple,
function print_message { echo "message content" } print_message print_message
impression de la sortie de deux fois.Il ne peut pas travailler pour vous. Essayez de nouveau et assurez-vous que votre fonction génère quelque chose de que
print_message
. Oui, le nom en lui-même est assez pour appeler une fonction dans un endroit qui arrive, maisreturn_value=print_message
est pas un endroit où cela se produit. Voir ideone.com/dnEvPAOriginalL'auteur cacciatc