Изучение Bash — файла настройки

#sed #sh #configure

#sed #sh #настройка

Вопрос:

Я неплохо разбираюсь в bash, и мне нравится учиться, просматривая чужие работы и файлы, которые я получаю из загрузок, и я наткнулся на это в файле конфигурации.

     # Name of the executable.
as_me=`$as_basename "$0" ||
$as_expr X/"$0" : '.*/([^/][^/]*)/*$' | 
     X"$0" : 'X(//)$' | 
     X"$0" : 'X(/)$' | 
     .     : '(.)' 2>/dev/null ||
echo X/"$0" |
    sed '/^.*/([^/][^/]*)/*$/{ s//1/; q; }
      /^X/(//)$/{ s//1/; q; }
      /^X/(/).*/{ s//1/; q; }
      s/.*/./; q'`
  

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

Комментарии:

1. Из какого конфигурационного файла это взято?

2. Вместо этого вы должны заменить старые обратные тики на круглые скобки. var=$(код)

3. Ну, поскольку это не мое, я могу согласиться. Если вы хотите предложить это производителю, просто погуглите, кто создал gtk-server-2.3.1

4. Ужасающий внешний вид, вероятно, связан с необходимостью работать с как можно большим количеством реализаций sh и sed , включая некоторые, которые могут даже предшествовать стандарту POSIX.

5. Потенциально могут быть запущены 3 разные команды: одна с именем $as_basename , одна с именем $as_expr и в качестве последнего средства sed . as_basename и as_expr , скорее всего, являются командами POSIX basename и expr соответственно.

Ответ №1:

Прежде всего я бы определенно посоветовал проверить эту ссылку

И, во-вторых, я углублюсь в некоторые sed вещи:

  • sed '/ : Это начало поиска по регулярному выражению
  • ^.* : Выполните поиск в начале строки ( ^ ) и найдите любое количество (т. Е. ноль или больше: * ) любого символа ( . ) Пожалуйста, обратите внимание, что когда ^ используется внутри [] , это означает, что его НЕТ в списке
  • /([^/][^/]*) : Затем найдите косую черту, за которой следует группа символов, не содержащих косой черты ( [^/][^/]* ). (...) обозначает группу, на которую можно ссылаться позже. Я вернусь к этому позже.
  • /*$ : Затем выполните поиск любого количества косых черт, а затем конца строки ( $ )
  • / : Появление второй, неэкранированной косой черты отмечает конец регулярного выражения и начало того, что sed должно произойти, когда он находит строку, соответствующую регулярному выражению
  • { s//1/; q; } : К сожалению, я не знаю точно, для чего предназначены фигурные скобки. Обычно они используются для групповой команды, но я никогда не видел, чтобы она использовалась в этой части косых черт. В любом случае, как упоминалось sed , позволяет выполнять обратную ссылку. 1 ссылается на первую (и единственную) группировку между первыми двумя косыми чертами, а именно [^/][^/]* . q Используется для выхода из sed после завершения этой команды, но поскольку она заключена в фигурные скобки, я не совсем уверен, как это влияет на всю команду.

В любом случае, это должно дать хорошее представление о том, как sed работает. Из того, что я могу сказать, кажется, что sed просматривает путь к файлу и захватывает одну его часть. Например, он передан some/crazy/file/location.ext , он вернет crazy
Надеюсь, это помогло! Обязательно ознакомьтесь с этой ссылкой, потому что это действительно полезный инструмент, как только освоитесь с ним. О, и если вы когда-нибудь будете использовать sed , пожалуйста, пожалуйста, пожалуйста, используйте : or _ или даже | в качестве разделителя!! Это предотвращает отвратительный вид штакетника, как sed см. Выше. Это можно было бы записать как

 sed ':^.*/([^/][^/]*)/*$:{ s::1:; q; }
      :^X/(//)$:{ s::1:; q; }
      :^X/(/).*:{ s::1:; q; }
      s:.*:.:; q'
  

который, я признаю, нелегко понять, но его легче читать.