Co oznacza `>>` w poleceniu terminalu?

14

Właśnie natrafiłem na polecenie podane poniżej -

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

Z tego, co zgaduję, jest prawdopodobnie używany do zatwierdzania zmian w .bash_profile, ale do czego dokładnie jest używany?

potwór
źródło
26
Tylko po to, aby wiedzieć, co poprawić w przyszłości: man bashjest napisany dość oficjalnym językiem, może być trudny do zrozumienia. Z drugiej strony wyrażenie bash >>zwraca kilka przydatnych linków w Google. To prawda, że ​​chcemy gromadzić wiedzę bez polegania na Google; z tego powodu może pasować nawet pytanie z łatwą do przeszukiwania odpowiedzią. Jednak fakt, że nie podałeś odpowiedzi od razu (patrz Czy mogę odpowiedzieć na własne pytanie? ) Ani nie wskazałeś istniejących zasobów (które być może potrzebujesz pomocy w zrozumieniu), wskazuje na brak badań.
Kamil Maciorowski
5
Aby uzyskać szczegółowy przegląd operatorów przekierowywania z wiersza poleceń, zobacz unix.stackexchange.com/q/159513/85039
Sergiy Kolodyazhnyy

Odpowiedzi:

31

Przekierowuje stdout programu przed >>i dołącza go do podanego pliku po.

kai-dj
źródło
28
„program przed” Co to oznacza? Polecenie oczywiście, ale przekierowania można również napisać wcześniej, tj.>> file command
rexkogitans
Przykład. Na Ubuntu 18.04 mogłem wpisać „apt search rust >> x”. Część „apt search rust” wyszukuje dostępne pakiety terminu „rust”, a następnie wysyła je do standardowego wyjścia (w tym przypadku jest to zwykle terminal). Jednak „>> x” mówi o przekierowaniu wyjścia na koniec pliku „x”. Gdybym tylko chciał zastąpić plik, potrzebowałbym tylko jednego „>”.
NomadMaker
@rexkogitans Ponad, nawet w środku polecenia, jeśli chcesz sprawić, że kod będzie mylący z czytaniem. echo a b >> c ddołącza się a b ddo pliku o nazwie c.
kasperd
@kasperd Możesz także rozproszyć przekierowanie stdin pomiędzy w dowolnej kolejności, dodatkowo.
rexkogitans
48

Krótka odpowiedź - co robi >>?

Za pomocą >>dołączasz dane wyjściowe polecenia do pliku.

Twoje przykładowe polecenie składa się zasadniczo z kilku części:

polecenie >> nazwa pliku

Tak więc wynik commandzostanie dołączony do filename.


Co dzieje się w konkretnym przypadku echo?

W konkretnym przypadku echo "…"polecenie przekazuje argumenty wejściowe na „standardowe wyjście”, które jest tak zwanym „standardowym deskryptorem wyjściowym”. Po argumentach wejściowych echonastępuje newline ( \n), aby uzyskać podział wiersza.

„Standardowy deskryptor wyjściowy” jest tutaj niczym więcej niż strumieniem wyjściowym wyświetlanym w powłoce podczas wykonywania polecenia. (Oznacza to, że po wpisaniu echo fooi naciśnięciu klawisza Enter foo\nrzeczywisty wynik echopolecenia jest wyświetlany przez powłokę, foopo której następuje nowa linia).

Zasadniczo wszystko, co pisze do linii poleceń, używa standardowego wyjścia. Istnieje również inny deskryptor zwany „stderr”, który jest zwykle używany do komunikatów o błędach. Będzie również drukowane jak standardowe, więc czasami mogą być przeplatane. I jest deskryptor stdin, który jest używany do wprowadzania danych. Zobacz ten artykuł, aby uzyskać więcej informacji.

Jak przekierować wyjście w powłoce?

Zawsze możesz przekierować stdout do deskryptora pliku, co możesz zrobić za pomocą jednego z tych operatorów:

  • >przekierowuje do deskryptora pliku. Tworzy plik, jeśli nie istnieje lub, jeśli już istnieje, obcina plik przed zapisaniem. Plik zostanie zatem zastąpiony przez stdout.

  • >>dołącza do deskryptora pliku. Tworzy plik, jeśli nie istnieje.

Możesz również przekierować stderr za pomocą 2>lub 2>>w podobny sposób. Lub możesz połączyć stderr i stdout w jeden plik: 2>&1robi to. Aby uzyskać więcej informacji na temat przekierowania i kilka innych przykładów, możesz przeczytać ten mały samouczek .

Jak mogę dowiedzieć się, co oznacza określony fragment kodu powłoki?

Ogólnie rzecz biorąc, możesz spróbować wyjaśnić stronę shellhell.com , która da ci wizualne wskazówki i informacje na temat konkretnego polecenia powłoki.

slhck
źródło
7

Dla osób TLDR, które lubią widzieć przykład;

Standardowe wyjście (nie błędy) polecenia przed >> zostanie dodane na końcu nazwanego na końcu pliku.

Więc jeśli plik „flintstones.txt” zawiera;

Fred
Barney

echo Dino >> flintstones.txt spowoduje dodanie „Dino” na końcu pliku;

Fred
Barney
Dino
Mark Boyce
źródło
Polecam dodanie przykładu echo Dino > flintstones.txtpokazującego, że jego zawartość byłaby po prostu Dinowykonana za pomocą pojedynczej strzałki w prawo.
JakeGould
-2

Znowu, jeśli tak

> somefile.txt

Cała zawartość pliku zostanie wyczyszczona.

rocksyne
źródło
Dlaczego kopiujesz inną odpowiedź?
Toto
@Toto Nie sądzę, że tak. Wydaje się być dodatkowa i bardzo cenna.
Volker Siegel
@Toto Oops! Przyglądając się bliżej, w rzeczywistości tak nie jest. Źle nawet w wielu aspektach. Dziwne - jest tu nowy, ale aktywny gdzie indziej - więc prawdopodobnie nie tylko trollingiem.
Volker Siegel
2
@VolkerSiegel: > fileusuwa plik, ale >> filenic nie robi.
Toto
ale to w żaden sposób nie odpowiada na pytanie i powinien być komentarzem
phuclv