Qu'est-ce qu'un nu <fait?

10

bash ne semble pas se plaindre si vous exécutez une commande comme

$ < some-file-that-exists

Rien ne semble arriver.

Vous pouvez également utiliser

$ <<<"any string"

et même la substitution de processus.

Alors, qu'est-ce que cela fait exactement et pourquoi est-ce autorisé? Cela pourrait-il être utile pour quelque chose?

Pilules d'explosion
la source
BTW: Pour le grand ZSH, "<foobar" est le même que "less foobar", comme votre redirection foobar vers le shell. Je pense que c'est un comportement assez intuitif. Un nu <vous donnera une erreur ( zsh: parse error near `\n') car aucun argument n'est donné.
math
@math, vous obtiendrez une erreur similaire bash, mais c'est intéressant less.
Explosion Pills

Réponses:

20

<configure la redirection pour une commande qui peut se produire avant ou après les instructions de redirection. C'est à dire

$ < file wc

fonctionne aussi bien que

$ wc < file

Mais si vous ne donnez pas de commande, bash configure la redirection et ne fait rien d'autre. Pour la redirection d'entrée, cela revient à ce que vous avez vu, rien, si le fichier existe et est lisible. Si le fichier n'existe pas ou n'est pas lisible, bash signalera une erreur. Pour la redirection de sortie, le fichier de sortie sera créé s'il n'existe pas. Tout fichier de sortie existant sera tronqué s'il >est utilisé; aucune troncature si >>est utilisée.

Kyle Jones
la source
en d'autres termes, ils sont un concis existe et créer
ratchet freak
@Kyle Jones Je pense que vous n'avez pas fait correspondre les deux opérateurs dans la dernière phrase.
jamesbtate
@Puddingfox Merci. J'ai édité la phrase finale à la fin pour clarifier.
Kyle Jones
Y a-t-il une raison d'utiliser < file wcvs wc < file?
Explosion Pills
1
@tandu Il est utile lors de l'utilisation de shells interactifs. Supposons que vous ayez une commande qui utilise la redirection et que vous souhaitiez la répéter avec un dernier argument différent. Si la redirection se trouve au début de la ligne, il est facile de taper control-P puis de modifier le dernier argument sans avoir à ignorer le langage "<foo> bar 2> & 1" comme vous le feriez s'il était à la fin. Au-delà, je n'en ai trouvé aucune utilité.
Kyle Jones
5

<lit depuis stdin par défaut, ou un fichier. votre expression ne fait rien avec l'entrée car vous n'avez rien fait après la lecture.

si vous faites le fichier de sortie <some-file-that-exist> à la fin, alors vous verrez que vous venez de lire le contenu du premier fichier et de l'écrire dans le deuxième fichier.

<<< est ici au format doc, donc il lit à partir d'une chaîne au lieu d'un fichier. cat <<< "n'importe quelle chaîne" pour voir ce que vous avez lu.

johnshen64
la source
2
pour référence future, veuillez modifier votre réponse pour ajouter des détails au lieu d'ajouter un commentaire
Nate Koppenhaver
2
"si vous faites un fichier de sortie <some-file-that-exist> à la fin, vous verrez que vous venez de lire le contenu du premier fichier et de l'écrire dans le deuxième fichier." C'est faux; sans commande, le fichier de sortie sera tronqué à zéro octet.
Kyle Jones