Существует ли способ сделать жемчуг-i не, ударяют символьные ссылки?

Вы говорите удару открывать файл и добавлять вывод команды sudo echo 'text' к нему, который, конечно, не работает начиная с Ваших выполнений удара некорневыми. В интерактивном режиме я обычно работаю sudo -s обойти это (с тех пор выполнения оболочки как корень и может открыть файл). С другой стороны, можно работать sudo sh -c "echo 'text' >> /file.txt", который также работает, но является чем-то вроде стычки со всей интерполяцией/выходом, которая может вмешаться, если Вы усложнили выражения.

12
17.03.2011, 00:50
3 ответа

Интересно ли маленькое sponge утилита общего назначения ("впитывают стандартный вход и пишут в файл"), от moreutils будет полезна в этом случае и будет ли это следовать за символьной ссылкой.

Автор описывает sponge как это:

Это решает проблему редактирования файлов, оперативных с инструментами Unix, а именно, что, если Вы просто перенаправляете вывод в файл, Вы пытаетесь отредактировать затем перенаправление, вступает в силу (избиение содержания файла), прежде чем первая команда в конвейере вернется к чтению из файла. Переключатели как sed -i и perl -i работа вокруг этого, но не каждая команда, которую Вы могли бы хотеть использовать в конвейере, имеет такую опцию, и Вы не можете использовать тот подход с несколькими-конвейерами-команд так или иначе.

Я обычно использую, моют губкой немного как это:

sed '...' file | grep '...' | sponge file
6
27.01.2020, 19:56
  • 1
    Эй прохладный, который работает. Я комментарий подозреваемого Gilles выше является "реальным" ответом, но так как он не сделал его как ответ, и так как я изучил новую утилиту, я возьму этого. :) –  mattdm 16.03.2011, 02:26
  • 2
    Но протестируйте Вас sponge для такого использования на практике? Что касается меня:еще нет. Вы могли оставить комментарий, указывающий, вел ли он себя в тесте путь, требуемый здесь? О, я вижу комментарий. Спасибо за подтверждение! –  imz -- Ivan Zakharyaschev 16.03.2011, 02:28
  • 3
    — да, я попробовал его перед ответом. Когда file в Вашем примере выше символьная ссылка, ссылка оставлена в покое и реальный измененный файл. –  mattdm 16.03.2011, 02:38
  • 4
    @mattdm: Да, благодарит за подтверждение! (Я заметил Ваши слова, "который работает" немного позже, чем я записал свой комментарий.) чтение –  imz -- Ivan Zakharyaschev 16.03.2011, 02:42

Если у вас есть последняя версия gawk , вам повезло. Существует функция FPAT , задокументированная здесь

awk 'BEGIN {
 FPAT = "([^|]+)|(\"[^\"]+\")"
}
{
 print "NF = ", NF
 for (i = 1; i <= NF; i++) {
    sub(/"$/, "", $i); sub(/^"/, "", $i);printf("$%d = %s\n", i, $i)
 }
}' file

NF =  3
$1 = field1
$2 = field2
$3 = field3
NF =  3
$1 = field1
$2 = field2|field2
$3 = field3
-121--55121-

встроенное ПО :

firmware:       i915/skl_dmc_ver1.bin

Для правильной работы многих устройств необходимы две функции. Драйвер и микропрограмма. Драйвер запрашивает микропрограммное обеспечение из файловой системы по адресу /lib/firmware . Это специальный файл, необходимый для оборудования, он не двоичный. Затем водолаз делает все необходимое для загрузки микропрограммного обеспечения в устройство. Микропрограммное обеспечение выполняет программирование аппаратных средств внутри устройства.


псевдоним :

alias:          pci:v00008086d00005A84sv*sd*bc03sc*i*

Это может быть разделено на части после символов:

  • v00008086 : v обозначает идентификатор поставщика , он идентифицирует производителя оборудования. Этот список поддерживается Группой специальных интересов PCI . Ваш номер 0x8086 означает «корпорация Intel».
  • d00005A84 : d обозначает идентификатор устройства , выбранный изготовителем. Этот идентификатор обычно объединяется с идентификатором поставщика для создания уникального 32-разрядного идентификатора для аппаратного устройства. Нет официального списка, и мне не удалось найти перечислять идентификаторов устройств Intel для поиска этого номера.
  • sv * , sd * : версия поставщика подсистемы и версия устройства подсистемы предназначены для дальнейшей идентификации устройства ( * указывает, что оно будет соответствовать любому)
  • bc03 : базовый класс . Он определяет, что это за устройство; Интерфейс IDE , Контроллер Ethernet , Контроллер USB ,... bc03 означает Контроллер дисплея . Их можно заметить из выходных данных lspci , поскольку lspci сопоставляет номер с классом устройства.
  • sc * : подкласс к базовому классу.
  • i * : интерфейс

intree :

intree:         Y

Все модули ядра начинают свою разработку как вне дерева . Как только модуль принимается к включению, он становится модулем в дереве . Модули без этого флага (набор N ) могут запятнать ядро .


vermagic :

vermagic:       4.2.0-1-amd64 SMP mod_unload modversions

При загрузке модуля проверяются последовательности в значении vermagic , если они совпадают. Если они не совпадают, появится ошибка, и ядро откажется от загрузки модуля. Это можно преодолеть с помощью флага -force для modprobe . Естественно, эти проверки есть для вашей защиты, поэтому использовать эту опцию опасно.

-121--37910-

Если известно, что somfile является symlink, можно явно указать полный путь к файлу следующим образом:

perl -pi.bak -e 's/foo/bar/' $ (readlink somfile)

Таким образом, исходный symlink остается нетронутым, поскольку замена теперь выполняется непосредственно

3
27.01.2020, 19:56

Если вы имеете дело с одним файлом, команда будет выглядеть следующим образом:

perl -i -pe'...' -- "$qfn"

Тогда решение следующее:

perl -i -pe'...' -- "$( readlink -e -- "$qfn" )"

Это обрабатывает как символические ссылки, так и не -символические ссылки.


Если вы имеете дело с произвольно большим количеством файлов, команда будет выглядеть следующим образом:

... | xargs -r perl -i -pe'...' --

Тогда решение следующее:

... | xargs -r readlink -ze -- | xargs -r0 perl -i -pe'...' --

Это обрабатывает как символические ссылки, так и не -символические ссылки.


Вниманиеreadlinkне является стандартной командой, поэтому ее наличие, аргументы и функциональность зависят от системы, поэтому обязательно ознакомьтесь с документацией. Например, в некоторых реализациях есть -f(, которые вы могли бы использовать и здесь ), но не -e, а в некоторых нет ни того, ни другого. busyboxreadlink -fведет себя как GNU readlink -e. А в некоторых системах есть команда realpathвместо readlink, которая обычно ведет себя как GNU readlink -f.

Имейте в виду, что с GNU readlink -eсимволические ссылки, которые не могут быть преобразованы в существующий файл, автоматически удаляются.

3
27.01.2020, 19:56

Теги

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