Что означает >> в терминальной команде?

5700
monster

Я наткнулся на команду только сейчас, приведенную ниже -

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

Из того, что я могу догадаться, он, вероятно, используется для фиксации изменений в .bash_profile, но для чего именно он используется?

11
Просто для того, чтобы вы знали, что нужно улучшить в будущем: «man bash» написан на довольно формальном языке, это может быть трудно понять. С другой стороны, фраза `bash >>` возвращает несколько полезных ссылок в Google. Это правда, что мы хотим собирать знания, не полагаясь на Google; по этой причине может подойти даже вопрос с легко доступным для поиска ответом. Однако тот факт, что вы не предоставили ответ сразу (см. [* Могу ли я ответить на свой вопрос? *] (Https://superuser.com/help/self-answer)), а также не указал на существующие ресурсы (что вам, возможно, понадобится помощь понять) указывает на отсутствие исследований. Kamil Maciorowski 6 лет назад 26
Подробный обзор операторов перенаправления командной строки см. По адресу https://unix.stackexchange.com/q/159513/85039. Sergiy Kolodyazhnyy 6 лет назад 5

4 ответа на вопрос

48
slhck

Краткий ответ - что делает >>?

С помощью >>вы добавляете вывод команды в файл.

Ваш пример команды состоит из нескольких частей, в основном:

команда >> имя файла 

Таким образом, результат commandбудет добавлен filename.


Что происходит в конкретном случае echo?

В вашем конкретном случае echo "…"команда выводит свои входные аргументы в «stdout», который является так называемым «стандартным дескриптором вывода». За входными аргументами echoследует новая \nстрока ( ), чтобы вы получили разрыв строки.

Здесь «стандартный выходной дескриптор» - это не что иное, как выходной поток, который отображается в вашей оболочке при выполнении команды. (То есть, когда вы набираете echo fooи нажимаете Enter, foo\nэто фактический вывод echoкоманды, который отображается вашей оболочкой, fooза которым следует новая строка.)

В основном все, что пишет в вашу командную строку, использует stdout. Существует также другой дескриптор, называемый «stderr», который обычно используется для сообщений об ошибках. Он также будет напечатан как stdout, поэтому иногда их можно перемежать. И есть дескриптор стандартного ввода, который используется для ввода. Смотрите эту статью для получения дополнительной информации.

Как вы перенаправляете вывод в оболочку?

Вы всегда можете перенаправить стандартный вывод в файловый дескриптор, что можно сделать с помощью одного из следующих операторов:

  • >перенаправляет на дескриптор файла. Он создает файл, если он не существует, или, если он уже существует, обрезает файл перед записью. Поэтому файл будет перезаписан stdout.

  • >>добавляет к дескриптору файла. Он создает файл, если он не существует.

Вы также можете перенаправить stderr с помощью 2>или 2>>аналогичным образом. Или вы можете объединить stderr и stdout в один файл: 2>&1делает это. Для получения дополнительной информации о перенаправлении и некоторых других примерах вы можете прочитать этот небольшой учебник .

Как я могу понять, что означает конкретный фрагмент кода оболочки?

Как правило, вы можете захотеть попробовать на сайтеhellhell.com, который даст вам визуальное руководство и информацию о конкретной команде оболочки.

31
kai-dj

Он перенаправляет стандартный вывод программы до >>и добавляет его в указанный файл после.

«Программа до» Что это значит? Команда, очевидно, но перенаправления также могут быть написаны с добавлением префикса, то есть `>> команда файла` rexkogitans 6 лет назад 28
Пример. В Ubuntu 18.04 я мог набрать «apt search rust >> x». Часть «apt search rust» ищет в доступных пакетах термин «ржавчина», а затем отправляет его стандартному выводу (обычно терминалу в данном случае). Однако «>> x» говорит, чтобы перенаправить вывод в конец файла «x». Если бы я просто хотел заменить файл, мне потребовалось бы только одно «>». NomadMaker 6 лет назад 0
@rexkogitans Более того, даже в середине команды, если вы хотите, чтобы ваш код был запутанным для чтения. `echo ab >> cd` добавит` abd` в файл с именем `c`. kasperd 6 лет назад 0
@kasperd Вы также можете разбросать перенаправление stdin между ними в любом порядке, дополнительно. rexkogitans 6 лет назад 0
7
Mark Boyce

Для людей TLDR, которые просто любят видеть пример;

Стандартный вывод (не ошибки) команды перед >> будет добавлен в конец имени файла.

Так что если файл "flintstones.txt" содержит;

Fred Barney 

echo Dino >> flintstones.txt приведет к добавлению 'Dino' в конец файла;

Fred Barney Dino 
Я бы порекомендовал вам добавить пример `echo Dino> flintstones.txt`, чтобы показать, что его содержимое будет просто` Dino`, если сделать это с одной стрелкой вправо. JakeGould 6 лет назад 0
-2
rocksyne

Опять же, если вы делаете

> somefile.txt 

Все содержимое файла будет очищено.

Почему вы копируете другой ответ? Toto 6 лет назад 0
@ Тото я не думаю, что он делает. Это кажется дополнительным и очень ценным. Volker Siegel 6 лет назад 0
@ Тото Упс! Если присмотреться, это на самом деле не так. Неправильно даже в нескольких аспектах. Странно - он новичок здесь, но активен в другом месте - так что, вероятно, не просто троллинг. Volker Siegel 6 лет назад 0
@VolkerSiegel: `> file` очищает файл, но` >> file` ничего не делает. Toto 6 лет назад 2
но это никак не отвечает на вопрос и должно быть комментарием phuclv 6 лет назад 0
@Toto. Сначала я извиняюсь, если ты обижаешься на мой ответ. И да, вы правы, я новичок здесь. Я видел этот вопрос в теме и подумал: «О, позвольте мне помочь этому человеку», и я думаю, что именно поэтому эта платформа существует. Для обмена. И если вы думаете, что я копирую чей-то ответ, скажите, какой из них выглядит так же просто и прямо, как мой. Поэтому я сделал опечатку добавления другого> к>, который я исправил. Так, что обратная реакция? Я не принимаю это на свой счет. Я просто хочу, чтобы вы знали, что во-первых, это место для помощи, чтобы не отреагировать. ура! rocksyne 6 лет назад 0

Похожие вопросы