Cosa significa `>>` nel comando terminale?


11

Mi sono imbattuto in un comando proprio ora dato di seguito -

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

Da quello che posso indovinare, è probabilmente usato per commettere i cambiamenti in .bash_profile ma a cosa serve esattamente?


26
Solo per farti sapere cosa migliorare in futuro: man bash è scritto con un linguaggio abbastanza formale, può essere difficile da capire. D'altra parte la frase bash >> restituisce pochi link utili in Google. È vero che vogliamo aggregare la conoscenza senza fare affidamento su Google; per questo motivo anche una domanda con una risposta facilmente ricercabile può andare bene. Tuttavia il fatto che nessuno dei due ha fornito la risposta immediatamente (vedi Posso rispondere alla mia domanda? ) né indicato le risorse esistenti (che forse hai bisogno di aiuto per capire) indica una mancanza di ricerca.
Kamil Maciorowski

5
Per una panoramica dettagliata degli operatori di reindirizzamento della riga di comando, vedere unix.stackexchange.com/q/159513/85039
Sergiy Kolodyazhnyy

Risposte:


31

Prima reindirizza lo stdout del programma >> e lo aggiunge al file specificato dopo.


28
"programma prima" Che cosa significa? Comanda ovviamente, ma i reindirizzamenti possono anche essere scritti prima, cioè >> file command
rexkogitans

Un esempio. Su Ubuntu 18.04 potrei digitare "apt search rust & gt; & gt; x" La parte "search search rust" cerca i pacchetti disponibili per il termine ruggine e quindi invia questo allo standard out (normalmente il terminale in questo caso). Tuttavia, "& gt; & gt; x" dice di reindirizzare l'output alla fine del file "x". Se volessi semplicemente sostituire il file, avrei solo bisogno di un singolo "& gt;".
NomadMaker

@rexkogitans Anche nel mezzo del comando se vuoi rendere il tuo codice confuso da leggere. echo a b >> c d aggiungerebbe a b d in un file chiamato c.
kasperd

@kasperd Puoi anche distribuire il reindirizzamento dello stdin tra un ordine e l'altro, in aggiunta.
rexkogitans

48

Risposta breve - cosa fa >> fare?

Con >>, si aggiunge l'output di un comando a un file.

Il tuo comando di esempio è composto da diverse parti, in pratica:

 comando  & Gt; & gt;  nome del file 

Quindi l'output di command verrebbe aggiunto a filename.


Cosa succede nel caso specifico di echo?

Nel tuo caso specifico, il echo "…" comando invia i suoi argomenti di input a "stdout", che è il cosiddetto "descrittore di output standard". Gli argomenti di input a echo sono seguiti da una nuova riga ( \n ), in modo da ottenere un'interruzione di riga.

Qui, un "descrittore di output standard" non è altro che un flusso di output che viene mostrato nella shell quando si esegue un comando. (Cioè, quando digiti echo foo e premi Invio, foo\n è l'output effettivo del echo comando, che viene mostrato dalla shell come foo seguito da una nuova riga.)

Fondamentalmente tutto ciò che scrive sulla riga di comando sta usando stdout. C'è anche un altro descrittore chiamato "stderr" che viene in genere utilizzato per i messaggi di errore. Sarà anche stampato come stdout, quindi a volte potrebbero essere intervallati. E c'è un descrittore di stdin che viene utilizzato per l'input. Vedere Questo articolo per maggiori informazioni.

Come si reindirizza l'output nella shell?

Puoi sempre reindirizzare stdout a un descrittore di file, che puoi eseguire con uno di questi operatori:

  • > reindirizza a un descrittore di file. Crea il file se non esiste o, se esiste già, tronca il file prima di scrivere. Il file verrà quindi sovrascritto con stdout.

  • >> aggiunge un descrittore di file. Crea il file se non esiste.

Puoi anche reindirizzare lo stderr usando 2> o 2>> in modo simile. Oppure puoi combinare stderr e stdout in un unico file: 2>&1 lo fa Per maggiori informazioni sul reindirizzamento e alcuni altri esempi, puoi leggere questo piccolo tutorial .

Come posso capire cosa significa un particolare codice shell?

In generale, puoi provare explainshell.com , che ti fornirà guida visuale e informazioni su un particolare comando di shell.


7

Per il TLDR persone a cui piace solo vedere un esempio;

L'output standard (non errori) del comando prima di & gt; & gt; verrà aggiunto alla fine del file chiamato dopo di esso.

Quindi se il file "flintstones.txt" contiene;

Fred
Barney

echo Dino >> flintstones.txt risulterà in "Dino" aggiunto alla fine del file;

Fred
Barney
Dino

Ti consiglierei di aggiungere un esempio di echo Dino > flintstones.txt mostrare il contenuto sarebbe semplicemente Dino se fatto con una singola freccia destra.
JakeGould

-2

Di nuovo, se lo fai

> somefile.txt

L'intero contenuto del file verrà cancellato.


Perché copi altre risposte?
Toto

@Toto non penso che lo faccia. Sembra essere adizionale e molto prezioso.
Volker Siegel

@Toto Oops! Guardando più da vicino, in realtà non è il caso. Sbagliato anche in molteplici aspetti. Strano - lui è nuovo qui, ma attivo altrove - quindi probabilmente non solo trolling.
Volker Siegel

2
@VolkerSiegel: > file cancella il file ma >> file non fa nulla
Toto

ma questo non risponde alla domanda in alcun modo e dovrebbe essere un commento
phuclv
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.