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

14

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

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

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

монстр
источник
26
Просто, чтобы вы знали, что нужно улучшить в будущем: man bashнаписано довольно формальным языком, это может быть трудно понять. С другой стороны, эта фраза bash >>возвращает несколько полезных ссылок в Google. Это правда, что мы хотим собирать знания, не полагаясь на Google; по этой причине может подойти даже вопрос с легко доступным для поиска ответом. Однако тот факт, что вы не предоставили ответ сразу (см. « Могу ли я ответить на свой вопрос?» ) И не указал на существующие ресурсы (которые вам, возможно, нужна помощь, чтобы понять), указывает на отсутствие исследований.
Камиль Мачоровски
5
Подробный обзор операторов перенаправления командной строки см. На unix.stackexchange.com/q/159513/85039
Сергей Колодяжный,

Ответы:

31

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

кай-ди-джей
источник
28
«Программа до» Что это значит? Команда, очевидно, но перенаправления также могут быть написаны с добавлением >> file command
префиксов
Пример. В Ubuntu 18.04 я мог набрать «apt search rust >> x». Часть «apt search rust» ищет в доступных пакетах термин «ржавчина», а затем отправляет его на стандартный вывод (обычно это терминал в данном случае). Однако «>> x» говорит, чтобы перенаправить вывод в конец файла «x». Если бы я просто хотел заменить файл, мне потребовалось бы только одно «>».
NomadMaker
@rexkogitans Даже в середине команды, если вы хотите, чтобы ваш код был запутанным для чтения. echo a b >> c dдобавит a b dв файл с именем c.
Касперд
@kasperd Вы также можете разбросать перенаправление stdin между ними в любом порядке, дополнительно.
Rexkogitans
48

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

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

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

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

Таким образом, результат 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 , который даст вам визуальное руководство и информацию о конкретной команде оболочки.

slhck
источник
7

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

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

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

Fred
Barney

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

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

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

> somefile.txt

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

rocksyne
источник
Почему вы копируете другой ответ?
Тото
@ Тото я не думаю, что он делает. Это кажется дополнительным и очень ценным.
Фолькер Сигел
@ Тото Упс! Если присмотреться, это на самом деле не так. Неправильно даже в нескольких аспектах. Странно - он новичок здесь, но активен в другом месте - так что, вероятно, не просто троллинг.
Фолькер Сигел
2
@VolkerSiegel: > fileочищает файл, но >> fileничего не делает.
Тото
но это никоим образом не отвечает на вопрос и должно быть комментарием
phuclv