При перенаправлении stdout в файл у Вас нет разрешения записи на

Более точно, двойной тире (--) используется в ударе встроенные команды и много других команд для выражения конца опций команды, после которых только приняты позиционные параметры.

Использование в качестве примера: позволяет говорят, что Вы хотите к grep файл для строки -v - обычно -v будет рассмотрен возможность для инвертирования соответствия, означающего (только показывают строки, которые не соответствуют), но с -- Вы можете grep для строки -v как это:

grep -- -v file
115
14.12.2010, 17:20
7 ответов

Да, использование tee. Так echo test > /tmp/foo становится

echo test | sudo tee /tmp/foo

Можно также добавить (>>)

echo test | sudo tee -a /tmp/foo
119
27.01.2020, 19:29
  • 1
    Мишень также произведет к stdout; иногда Вы не хотите содержание, заполняющее экран. Для фиксации этого сделать echo test | sudo tee /tmp/foo > /dev/null –  Shawn J. Goff 14.12.2010, 17:20
  • 2
    Как Вы сделаете это с heredoc? –  JohnDoea 19.11.2016, 04:54

tee вероятно, лучший выбор, но в зависимости от Вашей ситуации что-то вроде этого может быть достаточно:

sudo sh -c 'echo test > /tmp/foo'
14
27.01.2020, 19:29
  • 1
    3: eval вместо простого sh -c;-i, который изменит Ваш рабочий dir; при выполнении целой команды как корня, который мог бы измениться, это - поведение или может представить ненужный риск. почему это когда-либо получало upvote? –   31.08.2010, 13:38
  • 2
    , который Вы не сделали, но это вводит в заблуждение, обычно плохо и возможно даже опасное. –   31.08.2010, 23:24

Заменять содержание файла с выводом echo (как > оператор перенаправления оболочки).

echo test | sudo dd of=/tmp/foo

Записать в файл (вначале, хотя можно использовать seek производить при различных смещениях), не усекая (как 1<> Оператор оболочки Bourne):

echo test | sudo dd of=/tmp/foo conv=notrunc

Добавлять в файл (как >>), с GNU dd:

echo test | sudo dd of=/tmp/foo oflag=append conv=notrunc

См. также GNU dd conv=excl постараться не ударять существующий файл (как с set -o noclobber в оболочках POSIX) и conv=nocreat для противоположного (только обновляют существующий файл).

27
27.01.2020, 19:29
  • 1
    ! это облегчает потребность сделать echo test | sudo tee /tmp/foo >/dev/null отбрасывать вывод. –  Adam Katz 15.01.2015, 01:52
  • 2
    мне, вероятно, придется забрать это; dd ненадежно для этого, если Вы не используете неясные опции только для GNU iflag=fullblock oflag=fullblock, которые удаляют элегантность этого ответа. Я буду придерживаться с tee. –  Adam Katz 16.01.2015, 08:32
  • 3
    dd надежен с ненеясным bs=1 –  umeboshi 25.01.2015, 05:50
  • 4
    @umeboshi (hrmph), Но надежный, только если Вы испытаны достаточно для знания точно, что Вы делаете. Дляdd может быть довольно опасным (если не сказать: разрушительный), если только небольшая ошибка была сделана. Таким образом для новых пользователей, я рекомендовал бы tee метод, чтобы быть на безопасном берегу. –  syntaxerror 29.01.2016, 19:38
  • 5
    @AdamKatz, в случае dd of=file один (без count/skip...), это надежно. iflag=fullblock не нужно потому что здесь dd записи на выводе, что это считало на входе. Не имеет значения, если это не были полные блоки. –  Stéphane Chazelas 12.09.2017, 14:30

В то время как я соглашаюсь, это | sudo tee канонический путь, иногда sed (сюда принятие GNU sed) может работать:

cat sudotest 
line 1

sudo sed -i '1iitest' sudotest && cat sudotest 
itest
line 1

sudo sed -i '$aatest' sudotest && cat sudotest 
itest
line 1
atest

-i изменяет файл на месте. 1i средства вставляют перед строкой 1. $a средства добавляют после последней строки.

Или скопируйте в xclipboard:

somecommand | xclip
sudo gedit sudotest
move cursor to desired place, click middle mouse button to insert, save
5
27.01.2020, 19:29
  • 1
    Это сформулировано как Древняя китайская загадка. Не видьте, чтобы понять, как это получило столько upvotes. –  syntaxerror 29.01.2016, 19:36
  • 2
    @syntaxerror: Сэр, я сожалею, я не носитель английского языка. Если Вы указываете то, что неясно Вам, я мог попытаться улучшить свой ответ. По сравнению с 65 upvotes для Gert, 4, кажется, не, что много upvotes, также, разве Вы не думаете? –  user unknown 30.01.2016, 03:35
  • 3
    Хорошо я был бы довольно удовлетворен 4 :-D Ваш английский язык не плох вообще. Это просто сформулировано в своего рода кратком технике nerdspeak. Я должен предположить, что Вы - кодер. Кодеры друг среди друга поймут себя отлично тот путь, но некодер должен думать, что он сформулирован как..., как сказано. –  syntaxerror 31.01.2016, 22:22
  • 4
    Отметьте это sed -i на самом деле не изменяет файл на месте - он создает временный файл и переименовывает его на выходе. Таким образом, Вы не сможете сделать что-то как tail -f ... на исходном файле и посмотрите, что вывод использует sed -i ... в то время как конвейер работает –  Andrew Henle 14.03.2018, 12:24
  • 5
    @AndrewHenle: Да, так как размер может быть увеличен или shrinked, и так как это, вероятно, имеет место для большинства sed вызовов, и Вы не можете даже - afaik - пишут в то же местоположение на SSD, это - только псевдо 'на месте' операция. Как не носитель английского языка, я могу попросить краткое выражение, которое так, вероятно, не неправильно истолковано? Просто -i creates a new file of same name или есть ли что-то более компактное? Я предполагаю, что мне нравится in place, потому что это объясняет i. Страница справочника гну-sed называет его на месте также, и длинный флаг --in-place. –  user unknown 14.03.2018, 12:30

Я перебрасывал подсознательно идеи для подобной проблемы и предложил следующие решения:

  • sudo uncat где uncat программа, которая читает стандартный вход и пишет это в файл, названный на командной строке, но я не записал uncat все же.

  • sudocat вариант sudoedit то, что я еще не записал, что это делает инструмент для очистки sudo cat или sudo uncat.

  • или этот небольшой прием использования sudoedit с РЕДАКТОРОМ, который является сценарием оболочки

    #!/bin/sh
    # uncat
    cat > "$1"
    

    который может быть вызван как также |sudo ./uncat file или | EDITOR=./uncat sudoedit но это имеет интересные побочные эффекты.

2
27.01.2020, 19:29
  • 1
    cat берет список файлов для конкатенирования, поэтому некошка должна взять список файлов к ООН, конкатенируют к. Это должно было бы использовать волшебство решить, сколько вставить каждый файл. Альтернативное имя включает dog, to-file, redirect. –  ctrl-alt-delor 15.04.2015, 17:51
  • 2
    я не могу думать ни о какой причине, почему я хотел бы uncat когда я имею tee. –  Wildcard 29.09.2015, 12:26
  • 3
    Ну, tee имеет тривиальный недостаток, что он пишет свой stdin в его stdout — который тривиально смягчен путем перенаправления stdout к /dev/null.   Другие альтернативы включают dd of=/tmp/foo (упомянутый в другом ответе), который пишет информацию о статусе в stderr, и cp /dev/stdin /tmp/foo. –  Scott 17.02.2016, 16:44

Используйте sponge из пакета moreutils. Его преимущество в том, что он не записывает в стандартный вывод.

echo test | sudo sponge /tmp/foo

Используйте параметр -a для добавления к файлу вместо его перезаписи.

1
20.08.2021, 13:40

Ошибка возникает из-за порядка, в котором оболочка выполняет действия.

Перенаправление выполняется еще до того, как оболочка выполнит sudo , и поэтому выполняется с разрешениями пользователя, с которым вы в настоящее время работаете. Поскольку у вас нет прав на запись для создания / усечения цели перенаправления, вы получите ошибку отказано в разрешении из оболочки.

Решение состоит в том, чтобы гарантировать, что выходной файл создается под идентификатором, предоставленным вам sudo , например с tee :

$ generate_output | sudo tee target_file
1
20.08.2021, 13:40

Теги

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