Файл / etc / mtab
записывается командами mount
и umount
. Чтобы сохранить его в точности, потребуется немного поработать, потому что они могут обновлять / etc / mtab
, только если этот файл доступен и доступен для записи.
Для обычного случая, когда / etc
монтируется для чтения и записи в какой-то момент во время загрузки, дистрибутивы настраивают сценарий, который перезаписывает / etc / mtab
во время запуска, как только корневой раздел смонтирован для чтения и записи. Это необходимо в случае, если система отключилась без размонтирования всего (например, из-за сбоя системы или сбоя питания).
В вашем случае, когда / etc
находится в overlayfs, либо сценарий запуска запускается не в то время, когда / etc
все еще доступен только для чтения, либо он не поддерживает случай наложения корня. Поэтому, если вы хотите сохранить / etc / mtab
как обычный файл, вам придется настроить этот сценарий или время его выполнения.
Но вам, вероятно, не нужно этого делать. Обычно / etc / mtab
является символической ссылкой на / proc / mounts
. Эти два файла содержат в основном одинаковую информацию с одинаковым синтаксисом; с точки зрения приложений, которые их читают, они совместимы. Поскольку / proc / mounts
отражает текущую информацию о ядре, она всегда актуальна, и команды mount
и umount
их не касаются.
Обратной стороной / proc / mounts
по сравнению с / etc / mtab
является то, что он показывает информацию (особенно параметры монтирования), напечатанную ядром, а не точные параметры. передается команде mount
. Так что немного информации теряется. Однако эта информация редко бывает полезной.
Дополнительная фильтрация, которую вы выполняете для удаления новой строки, применяется только к команде date
, поэтому попробуйте
{ cat /proc/loadavg && date; } | tr -d '\n'
Вот так:
( cat /proc/loadavg && date ) | sed 'N; s/\n/ @@ /'
Во-первых, ваши попытки не работают, потому что канал |
применяется только к date
, а не к обеим командам. Чтобы обойти это, вам нужно запустить cat ... && date
в подоболочке, а затем перенаправить stdout
подоболочки.
Тогда tr '\ n' '@@'
не работает, потому что вы не можете заменить символ несколькими символами.
И sed 's / \ n / @@ / g'
не работает, потому что sed
может видеть строки только по одной. Чтобы он видел новые строки, вам нужно объединить обе строки ввода в одном буфере. Это то, что делает N
выше.
Это может вам помочь,
( cat /proc/loadavg && date ) | awk 'ORS=" @@ "'
Вы можете сделать это:
echo `cat /proc/loadavg` @@ `date`
Как насчет этого?
export DELIMITER=' @@ '; cat /proc/loadavg | tr -d '\n'; echo -n "$DELIMITER" && date
Вывод: 0,34 0,39 0,40 1/1065 29353 @ @ Fr 26. Авг, 09:30:26 CEST 2016
Он удаляет новую строку только после вывода строки с помощью cat, затем отображает строку-разделитель без новой строки (-n) и, наконец, добавляет вывод даты.
Просто для чего-то другого...
(cat /proc/loadavg && date) | paste -d@ - - | sed 's/@/ @@ /'
paste -d@ - -
вставляет две строки бок о бок с "@" между ними. Затем sed заменяет одиночный "@" на " @@ "
Лучше всего использовать printf
. У вас есть две строки, и вы хотите вывести их с дополнительным форматированием. Это именно то, что делает printf
.
$ printf "%s @@ %s\n" "$(cat /proc/loadavg)" "$(date)"
Ваша попытка tr
не работает, поскольку tr
изменяет символов , а не слова. Вы можете использовать его для замены символов новой строки одним единственным символом:
$ ( cat /proc/loadavg; date ) | tr '\n' '@'
... но это не совсем то, что вам нужно.
Ваша попытка sed
не работает, так как новая строка удаляется из ввода sed
(т.е. sed -n '/ \ n / p' inputfile
никогда бы ничего не напечатал).
Вы все еще можете сделать это с помощью sed
, если вы прочитаете вторую строку (с даты
) с помощью команды редактирования N
при редактировании первой строки (которая помещает между ними новую строку):
$ ( cat /proc/loadavg; date ) | sed 'N;s/\n/ @@ /'
... но я лично предпочел бы решение printf
.