/ etc / fstab при сбое одного монтирования ничего не монтируется?

Хотя это не совсем то, что нужно (динамическое изменение курсора), bash 4.4/readline 7.0 добавит поддержку для динамического изменения приглашения . Вы сможете указать пользовательские индикаторы для режимов вставки/команд (это отличается от текущей опции show-mode-in-prompt , которая жестко закодирована для использования + и : ).

К сожалению, эти версии в настоящее время находятся в бета-версии и, похоже, еще не все ошибки были устранены. Они также не имеют возможности указать, где в приглашении должен появиться индикатор режима.

Тем временем я опубликовал исправленные версии bash 4 .3/readline 6,3 на github с этой функциональностью.

-121--14752-

Как насчет этого sed one-liner:

sed -n '${;p;q;};N;/^ *\([^ ][^ ]*  *[^ ][^ ]*\)\( .*\)*\n *\1/{;s/\n.*//;h;G;D;};P;D' inputfile

Это был хороший хитрый вызов; Спасибо!:)

На высоком уровне, то, что это делает, итерация через файл ввода, сравнивая две строки за раз. Если строки совпадают с первыми двумя словами, то вторая строка из этих двух слов отбрасывается, а следующая строка из файла берется для сравнения с первой строкой. Если строки не совпадают , первая печатается, а вторая сохраняется для сравнения с более поздними строками. При достижении конца файла печатается строка, в настоящее время "удерживаемая для сравнения".

Объяснение обдува:

-n  doN't print lines by default; only if specified to print them.

${;p;q;};   if on the la$t line then Print the line and Quit.
N;  append a newline followed by the Next line of the file to the pattern space
/^ *\([^ ][^ ]*  *[^ ][^ ]*\)\( .*\)*\n *\1/    A very tricky regex:
    match any leading spaces, followed by a nonspace sequence, space or
    multiple spaces, nonspace sequence, then optionally a space followed
    by anything, then a newline, then any leading spaces, then the matched
    two words from earlier again.
{;  if that regex matched the pattern space, excecute the following.
s/\n.*//;   delete the first newline and everything after it
h;  copy the pattern space contents to the Hold space
G;  append (Get) a newline followed by the hold space contents to the pattern space
D;  delete everything in the pattern space up to the first newline, then start from the beginning of this sequence (with the ${ block)
};  end of block.  Skip to here if the tricky regex didn't match.
P;  Print everything in the pattern space up to the first newline.
D   Delete the pattern space up to the first newline.

Обратите внимание, что вышеуказанное является очень портативным. Сознательно. Просто для вызова я хотел, чтобы он был доступен без ? или + (поскольку они не совместимы с POSIX), что делает регекс гораздо более тонким.

Кроме того, логический поток не включает никаких ветвей, хотя ветви совместимы с POSIX и доступны повсеместно. Зачем я это сделал? Это связано с тем, что не все реализации sed позволяют указывать метки в одной строке. Для них требуется \ и новая строка после метки. GNU sed допускает использование меток в фактическом однослойном корпусе, и, например, BSD sed не допускает.

Каждый из следующих двух лайнеров является точным эквивалентом использования GNU sed, единственное отличие состоит в том, что они более надежны, обрабатывая вкладки, а также пробелы:

sed -n ':k;${;p;q;};N;/^\s*\(\S\+\s\+\S\+\)\(\s.*\)\?\n\s*\1/{;s/\n.*//;bk;};P;D' inputfile
sed -n ':k;${;p;q;};N;s/^\(\s*\(\S\+\s\+\S\+\)\(\s.*\)\?\)\n\s*\2.*$/\1/;tk;P;D' inputfile

Я в основном сделал это для удовольствия.:) Я думаю, что 1_CR's ответ является лучшим, и, конечно, это проще всего на сегодняшний день.

Если ваши требования становятся несколько более сложными, чем в настоящее время, и его подход не будет работать, лучший инструмент, вероятно, неловко . Но я еще не научился awk и я научился sed .:)

-121--154278-

sed '$!N;/^\[second/,/^\n\[/P;D' outfile

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

В основном, для каждой входной линии, которая является ! не последний $ , sed также извлекает строку N ext и добавляет ее в образец пробел после вставленного разделителя символов \n ewline. Каждый раз, когда это происходит, образец пространство сдвигается:

 ^Line1\nLine2$
 ^Line2\nLine3$
 ^Line3\nLine4$

Если текущий образец пространство соответствует узорам ^\[ секунда или ^\n\[ или любой строке, которая возникает между этими двумя, sed будет P печататься вплоть до первого \n ewline в образец пространстве - и поэтому печатается только

В последний раз sed D удаляет до первой возникшей \n ewline в образец пространстве и снова запускает сценарий сверху - вот как мы получаем эффект сдвига. Это называется скользящим окном . Работает очень хорошо, и довольно быстро.


Я полагаю, есть несколько версий этого вопроса или что-то в этом роде? Как бы там ни было, пойти противоположным путем на самом деле не так сложно.

Вы можете сделать это как...

sed -ne '/^\[[^s]/,/^\[s/p' out

Который просто печатает любое содержимое, которое не следует за заголовком, начинающимся с символа s , и все заголовки независимо от того. Он не делает аккуратную маленькую новую линию после, хотя:


[first attempt]
a=10
b=20

[second attempt]
[third attempt ]
a=30
b=50

Если вы хотите получить немного более ясно вы можете сделать это тоже:

sed '/^\[[second]/P;$!N;//,/\n$/!P;D' out

... который делает аккуратную маленькую новую линию...

[first attempt]
a=10
b=20

[second attempt]

[third attempt ]
a=30
b=50

Все это диапазоны sed , и для каждого совпадающего выражения, которое выглядит следующим образом:

/match1/,/match2/command

... sed применит команду как к согласованным линиям, так и ко всем линиям между ними.

0
04.05.2018, 18:33
1 ответ

Реализуйте эти внешние ресурсы как монтирования autofs. Это позволит завершить работу fstab, а автомонтирование, пространственная функция ядра -, сможет согласовать создание внешних ссылок по мере необходимости и при их наличии.

Возможно, вам потребуется что-то добавить в ОС, чтобы настроить ее. На

Centos/Redhat: yum install autofs

Ubuntu: apt-get install autofs

Затем следуйте инструкциям вашего дистрибутива для настройки.

Примечание:
Параметр --ghostсохранит «ожидаемый» путь к базовому каталогу на месте монтирования. Некоторым приложениям становится неприятно, если базовый путь монтирования отсутствует, а затем создается на лету.

Кроме того, если монтируемые общие ресурсы Windows защищены от использования SMB 1.0, обязательно используйте аргумент vers=2\.1в строке сопоставления, чтобы указать, что попытка монтирования должна выполняться на SMB 2.1, в противном случае возникнут длительные тайм-ауты и сбои. произойдет монтирование.

0
28.01.2020, 04:23

Теги

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