Que signifie `>>` dans la commande de terminal?

14

Je suis tombé sur une commande qui vient d'être donnée ci-dessous -

$ echo 'eval "$(jenv init -)"' >> ~/.bash_profile

D'après ce que je peux deviner, il est probablement utilisé pour valider les modifications dans .bash_profile, mais à quoi sert-il exactement?

monstre
la source
26
Juste pour vous dire quoi améliorer à l'avenir: man bashest écrit avec un langage assez formel, il peut être difficile à comprendre. D'un autre côté, l'expression bash >>renvoie peu de liens utiles dans Google. Il est vrai que nous voulons agréger les connaissances sans compter sur Google; pour cette raison, même une question avec une réponse facilement consultable peut convenir. Cependant, le fait que vous n'ayez pas fourni la réponse tout de suite (voir Puis-je répondre à ma propre question? ) Ni indiqué les ressources existantes (que vous pourriez avoir besoin d'aide pour comprendre) indique un manque de recherche.
Kamil Maciorowski
5
Pour un aperçu détaillé des opérateurs de redirection de ligne de commande, voir unix.stackexchange.com/q/159513/85039
Sergiy Kolodyazhnyy

Réponses:

31

Il redirige la sortie standard du programme avant >>et l'ajoute au fichier donné après.

kai-dj
la source
28
"programme avant" Qu'est-ce que cela signifie? Commandez évidemment, mais les redirections peuvent aussi être écrites >> file command
pré
Un exemple. Sur Ubuntu 18.04, je pouvais taper "apt search rust >> x" La partie "apt search rust" recherche les paquets disponibles pour le terme rust et l'envoie ensuite à la sortie standard (normalement le terminal dans ce cas). Cependant, le ">> x" indique de rediriger la sortie vers la fin du fichier "x". Si je voulais juste remplacer le fichier, je n'aurais besoin que d'un seul ">".
NomadMaker
@rexkogitans Over même au milieu de la commande si vous voulez rendre votre code confus à lire. echo a b >> c ds'ajouterait a b dà un fichier nommé c.
kasperd
@kasperd Vous pouvez également disperser la redirection stdin entre les deux dans n'importe quel ordre, en plus.
rexkogitans du
48

Réponse courte - que fait >>-on?

Avec >>, vous ajoutez la sortie d'une commande à un fichier.

Votre exemple de commande se compose de plusieurs parties, essentiellement:

commande >> nom de fichier

Ainsi, la sortie de commandserait ajoutée à filename.


Que se passe-t-il dans le cas spécifique de echo?

Dans votre cas spécifique, la echo "…"commande envoie ses arguments d'entrée à «stdout», qui est ce que l'on appelle le «descripteur de sortie standard». Les arguments d'entrée à echosont suivis d'un saut de ligne ( \n), de sorte que vous obtenez un saut de ligne.

Ici, un «descripteur de sortie standard» n'est rien de plus qu'un flux de sortie affiché dans votre shell lorsque vous exécutez une commande. (Autrement dit, lorsque vous tapez echo fooet appuyez sur Entrée, foo\nc'est la sortie réelle de la echocommande, qui est affichée par votre shell, foosuivie d'une nouvelle ligne.)

Fondamentalement, tout ce qui écrit sur votre ligne de commande utilise stdout. Il existe également un autre descripteur appelé «stderr» qui est généralement utilisé pour les messages d'erreur. Il sera également imprimé comme stdout, donc parfois ils pourraient être intercalés. Et il y a un descripteur stdin qui est utilisé pour l'entrée. Consultez cet article pour plus d'informations.

Comment redirigez-vous la sortie dans le shell?

Vous pouvez toujours rediriger stdout vers un descripteur de fichier, ce que vous pouvez faire avec l'un de ces opérateurs:

  • >redirige vers un descripteur de fichier. Il crée le fichier s'il n'existe pas ou, s'il existe déjà, tronque le fichier avant l'écriture. Le fichier sera donc écrasé par stdout.

  • >>ajoute à un descripteur de fichier. Il crée le fichier s'il n'existe pas.

Vous pouvez également rediriger stderr en utilisant 2>ou 2>>de manière similaire. Ou vous pouvez combiner stderr et stdout en un seul fichier: 2>&1fait cela. Pour plus d'informations sur la redirection et quelques exemples supplémentaires, vous pouvez lire ce petit tutoriel .

Comment puis-je comprendre ce que signifie un morceau particulier de code shell?

Généralement, vous voudrez peut-être essayer expliquehell.com , qui vous donnera des conseils visuels et des informations sur une commande shell particulière.

slhck
la source
7

Pour les TLDR qui aiment juste voir un exemple;

La sortie standard (pas les erreurs) de la commande avant le >> sera ajoutée à la fin du fichier qui porte son nom.

Donc, si le fichier "flintstones.txt" contient;

Fred
Barney

echo Dino >> flintstones.txt entraînera l'ajout de «Dino» à la fin du fichier;

Fred
Barney
Dino
Mark Boyce
la source
Je recommanderais que vous ajoutiez un exemple de echo Dino > flintstones.txtpour montrer le contenu de celui-ci serait simplement Dinos'il est fait avec une seule flèche droite.
JakeGould
-2

Encore une fois, si vous le faites

> somefile.txt

Tout le contenu du fichier sera effacé.

rocksyne
la source
Pourquoi copiez-vous une autre réponse?
Toto
@Toto Je ne pense pas qu'il le fasse. Il semble être supplémentaire et très précieux.
Volker Siegel
@Toto Oups! En y regardant de plus près, ce n'est en fait pas le cas. Faux même sous plusieurs aspects. Bizarre - il est nouveau ici, mais actif ailleurs - donc probablement pas seulement à la traîne.
Volker Siegel
2
@VolkerSiegel: > fileefface le fichier mais >> filene fait rien.
Toto
mais cela ne répond en rien à la question et devrait être un commentaire
phuclv