Более точно, двойной тире (--
) используется в ударе встроенные команды и много других команд для выражения конца опций команды, после которых только приняты позиционные параметры.
Использование в качестве примера: позволяет говорят, что Вы хотите к grep файл для строки -v
- обычно -v
будет рассмотрен возможность для инвертирования соответствия, означающего (только показывают строки, которые не соответствуют), но с --
Вы можете grep для строки -v
как это:
grep -- -v file
Да, использование tee
. Так echo test > /tmp/foo
становится
echo test | sudo tee /tmp/foo
Можно также добавить (>>
)
echo test | sudo tee -a /tmp/foo
tee
вероятно, лучший выбор, но в зависимости от Вашей ситуации что-то вроде этого может быть достаточно:
sudo sh -c 'echo test > /tmp/foo'
eval
вместо простого sh -c
;-i, который изменит Ваш рабочий dir; при выполнении целой команды как корня, который мог бы измениться, это - поведение или может представить ненужный риск. почему это когда-либо получало upvote?
–
31.08.2010, 13:38
Заменять содержание файла с выводом 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
для противоположного (только обновляют существующий файл).
echo test | sudo tee /tmp/foo >/dev/null
отбрасывать вывод.
– Adam Katz
15.01.2015, 01:52
dd
ненадежно для этого, если Вы не используете неясные опции только для GNU iflag=fullblock oflag=fullblock
, которые удаляют элегантность этого ответа. Я буду придерживаться с tee
.
– Adam Katz
16.01.2015, 08:32
dd
может быть довольно опасным (если не сказать: разрушительный), если только небольшая ошибка была сделана. Таким образом для новых пользователей, я рекомендовал бы tee
метод, чтобы быть на безопасном берегу.
– syntaxerror
29.01.2016, 19:38
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
sed -i
на самом деле не изменяет файл на месте - он создает временный файл и переименовывает его на выходе. Таким образом, Вы не сможете сделать что-то как tail -f ...
на исходном файле и посмотрите, что вывод использует sed -i ...
в то время как конвейер работает
– Andrew Henle
14.03.2018, 12:24
-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
но это имеет интересные побочные эффекты.
cat
берет список файлов для конкатенирования, поэтому некошка должна взять список файлов к ООН, конкатенируют к. Это должно было бы использовать волшебство решить, сколько вставить каждый файл. Альтернативное имя включает dog
, to-file
, redirect
.
– ctrl-alt-delor
15.04.2015, 17:51
uncat
когда я имею tee
.
– Wildcard
29.09.2015, 12:26
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 для добавления к файлу вместо его перезаписи.
Ошибка возникает из-за порядка, в котором оболочка выполняет действия.
Перенаправление выполняется еще до того, как оболочка выполнит sudo
, и поэтому выполняется с разрешениями пользователя, с которым вы в настоящее время работаете. Поскольку у вас нет прав на запись для создания / усечения цели перенаправления, вы получите ошибку отказано в разрешении
из оболочки.
Решение состоит в том, чтобы гарантировать, что выходной файл создается под идентификатором, предоставленным вам sudo
, например с tee
:
$ generate_output | sudo tee target_file
echo test | sudo tee /tmp/foo > /dev/null
– Shawn J. Goff 14.12.2010, 17:20