1 votes

Que retourne réellement `ls` ?

J'ai commencé à utiliser Linux il y a 3 jours, alors soyez indulgent avec moi :)

Je ne comprends pas vraiment la structure des données renvoyées par de nombreuses commandes Shell. Je m'explique mieux :

Chaque fois que je lance des commandes telles que ls qu'est-ce qui est renvoyé exactement ? Et par renvoyé, je ne veux pas dire ce qui est imprimé à l'écran mais plutôt ce qui est en mémoire. Puis-je utiliser la sortie renvoyée par ls par exemple ? Ou bien cette commande renvoie-t-elle null et ne fait qu'imprimer des choses à l'écran ? Comment puis-je vérifier les données qui sont renvoyées ?

Et plus généralement, où puis-je vérifier ce que renvoie chaque commande ?

Merci !

4voto

James Mertz Points 390

Ce que vous voyez est ce que vous obtenez, vraiment. Tout ce qui a été imprimé après avoir lancé ls a été imprimé par la commande 'ls' elle-même - il y avait pas de valeur de retour intermédiaire qui a dû être reformatée.

Shell ne sont pas exactement comme les fonctions des langages de programmation - elles ne peuvent pas retourner autre chose qu'un seul entier : le " statut de sortie ". La plupart des shells permettent d'inspecter cette valeur par le biais de la fonction $? variable. (La convention est de retourner 0 en cas de succès ; 1 ou plus en cas d'échec).

Ainsi, toutes les sorties que vous voyez sont produites non pas par une valeur de retour, mais en écrivant du texte ordinaire dans des fichiers spéciaux appelés "stdout" et "stderr". pendant l'exécution de la commande (la première est destinée à la sortie normale, la seconde aux avis et aux messages d'erreur).

Bien sûr, à l'intérieur de le programme 'ls', vous trouverez des appels à des fonctions de la libc telles que readdir() qui renvoie un fichier struct dirent ou stat() qui renvoie un struct stat . Cependant, aucun d'entre eux n'est renvoyé dans le monde extérieur.

Vous pouvez donc utiliser la sortie de 'ls' ? Dans un sens, oui, en fait, une grande partie de l'interface utilisateur "Unix" traditionnelle est construite sur l'idée d'utiliser la sortie d'un programme comme entrée d'un autre programme - c'est ce que fait la fonction "ls". | opérateur de tuyaux est pour. Cependant, gardez à l'esprit que la sortie de 'ls' est spécifiquement formatée pour la consommation humaine et est pas facilement analysable par une machine. En d'autres termes, vous ne devrait pas utiliser la sortie de 'ls' dans scripts même si vous le pouvez.

(La tuyauterie fonctionne mieux lorsque le programme initial a été écrit pour produire une sortie quelque peu structurée. C'est la raison pour laquelle de nombreux outils peuvent être exécutés avec des options permettant de produire un texte bien formaté. または texte analysable par une machine. Comparez lsblk vs lsblk --raw vs lsblk --json .)


Il existe des exceptions - certains shells ont tenté de prendre en charge des types de retour flexibles, mais PowerShell est le seul exemple largement connu. Les cmdlets PowerShell peuvent renvoyer des types .NET Runtime arbitraires.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X