Идиомы `set -e` и` grep` для предотвращения преждевременного выхода из сценария оболочки, когда шаблон не найден

Во-первых, удостоверьтесь, что можно проверить с помощью ping-запросов хост с помощью IP-адреса, чтобы гарантировать, чтобы у Вас была возможность соединения.

Самая простая опция решить этот вопрос добавила бы следующую строку к Вашему /etc/hosts файл.

192.168.1.1 имени хоста

Замените IP-адрес и имя хоста со значениями, соответствующими Вашей ситуации. Это позволит Вашей машине разрешать имя хоста правильно.

Однако могли бы быть некоторые определенные для самбы конфигурации, которые необходимо реализовать, чтобы совместно использовать файлы, которые я не могу вспомнить первое, что пришло на ум.

15
09.10.2015, 16:13
1 ответ

Все, что следует учитывать, поглощение всего файла может быть самым быстрым способом.

Основной синтаксис таков:

sed -e '1h;2,$H;$!d;g' -e 's/__YOUR_REGEX_GOES_HERE__...'

Обратите внимание на то, что если файл чрезвычайно велик, использование всего файла может оказаться невозможным. Для таких случаев другие ответы, представленные здесь, предлагают индивидуальные решения, которые гарантируют работу с небольшим объемом памяти.

Для всех других ситуаций взлома и косой черты, просто предваряя -e '1h; 2, $ H; $! d; g' , за которым следует ваш первоначальный аргумент sed regex, в значительной степени получает выполненную работу.

например.

$ echo -e "Dog\nFox\nCat\nSnake\n" | sed -e '1h;2,$H;$!d;g' -re 's/([^\n]*)\n([^\n]*)\n/Quick \2\nLazy \1\n/g'
Quick Fox
Lazy Dog
Quick Snake
Lazy Cat

Что делает -e '1h; 2, $ H; $! d; g' ?

1 , 2, $ , $! - это спецификаторы строк, ограничивающие строки, на которых выполняется непосредственно следующая команда.

  • 1 : только первая строка
  • 2, $ : все строки, начиная со второй
  • $! : Каждая строка, отличная от последней

Таким образом, расширено, это то, что происходит на каждой строке N строки входа.

  1: h, d
  2: H, d
  3: H, d
  .
  .
N-2: H, d
N-1: H, d
  N: H, g

Команде g не присваивается спецификатор строки, но предыдущая команда d имеет специальное предложение " Запуск следующего цикла. ", и это предотвращает выполнение g на всех линиях, кроме последней.

Что касается значения каждой команды:

  • Первая h , за которой следуют H s на каждой строке, копирует указанные строки ввода в sed hold космоса .
  • После этого d отбрасывает каждую строку, чтобы предотвратить запись этих строк в выходные данные. Однако пространство хранения сохраняется.
  • Наконец, в самой последней строке g восстанавливает накопление каждой строки из удерживаемого пространства , так что sed может выполнять свой regex на всем входе (а не в линейном режиме) и, следовательно, может совпадать на \n s.
-121--579-

Как и @ lese говорит try:

chmod 640 /etc/shadow
chown root:shadow /etc/shadow

и если это вы «Операция не разрешена» попробуйте:

lsattr /etc/shadow

и если там написано --------------e- , затем запустите chattr -i/etc/shadow и chmod снова.

-121--150239-

Можно поместить grep в состояние , если , или если состояние выхода вас не волнует, добавить | | true .

Пример: grep убивает оболочку

$ bash
$ set -e
$ echo $$
33913
$ grep foo /etc/motd
$ echo $$
9233

решение 1: выбросить ненулевое состояние выхода

$ bash
$ set -e
$ echo $$
34074
$ grep foo /etc/motd || true
$ echo $$
34074

решение 2: явно проверить состояние выхода

$ if ! grep foo /etc/motd; then echo not found; fi
not found
$ echo $$
34074

На странице bash man обсуждает set -e :

Оболочка не выходит, если команда отказ является частью команды перечислять непосредственно после , пока или до ключевое слово, часть теста после зарезервированных слов if или elif ,часть любую команду, выполненную в списке & & или ││, за исключением команды, следующей за окончательная & & или ││, любая команда в конвейере, но последняя, или если команда возвращаемое значение инвертируется с помощью ! .

19
27.01.2020, 19:50

Теги

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