Поймите сложную замену команды с {} и несколько \ls'

TERM=vt100 vimdiff должен вызвать vimdiff с ТЕРМИНОМ временно набор к vt100. (пока команда не заканчивается). Это помогает судить других: xterm или xterm-цвет или xterm-256color, и т.д.

5
21.08.2018, 03:01
3 ответа

Вывод от 3 ls команды передаются до paste команда, которая объединяет их в значение:

$VOLTDB_VOLTDB"/voltdb-*.jar:$VOLTDB_LIB"/*.jar:$VOLTDB_LIB"/extension/*.jar

Примечание: Переменные $VOLTDB_VOLTDB и $VOLTDB_LIB будет расширен и может быть больше значений, чем всего один файл для каждого из них ls команды. Посмотрите * там? Это - символ шарика, который действует как подстановочный знак и расширяется до чего-либо между левой стороной (voltdb-) и правой стороной (.jar), например.

Они соответствовали бы:

voltdb-1.jar
voltdb-blah.jar
voltdb-12345.jar

Все затем включено в переменную APPCLASSPATH:

APPCLASSPATH=$CLASSPATH:$VOLTDB_VOLTDB"/voltdb....etc.

Команда вставки

Вот пример, где я использую seq команда для генерации последовательности чисел, 1-10.

$ seq 10 | paste -sd ':' -
1:2:3:4:5:6:7:8:9:10

Вы видите что paste команда объединяет вывод и разделяет его с двоеточием (:).

Можно также подражать команде в качестве примера как это:

$ { echo "hi1"; echo "hi2"; echo "hi3"; } | paste -sd ':' -
hi1:hi2:hi3

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

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

Примеры вставки

Вот пример с 2 -.

$ seq 10 | paste - -
1       2
3       4
5       6
7       8
9       10

Вот 3 -.

$ seq 10 | paste - - -
1       2       3
4       5       6
7       8       9
10

Таким образом, это говорит paste сколько аргументов paste должен распечатать на каждой строке. Но не смущайтесь, пример, с которым Вы имеете дело, просто берет вход от STDIN, разделяя каждый аргумент на пробелах, и печатая сопровождаемый a :. При предоставлении нескольким -Вы говорите paste взять аргументы, 2 и время, 3 за один раз, и т.д.

Аргументы 2 за один раз, разделенный ::

$ seq 10 | paste -d ':' - -
1:2
3:4
5:6
7:8
9:10

$ seq 10 | paste -d ':' - - -
1:2:3
4:5:6
7:8:9
10::

Кстати, если Вы включаете -s переключатель Вы говорите paste взять аргументы последовательно (последовательно). Наблюдайте то, что происходит, когда Вы используете его на одном из примеров выше.

2 за один раз:

$ seq 10 | paste -sd ':' - -
1:2:3:4:5:6:7:8:9:10

3 за один раз:

$ seq 10 | paste -sd ':' - - -
1:2:3:4:5:6:7:8:9:10
5
27.01.2020, 20:34
  • 1
    Кроме того, бит с paste умный путь состоит в том, чтобы получить результаты в a PATH разделенный от двоеточия формат. –  kurtm 10.10.2013, 23:30
  • 2
    @kurtm - держатся, пока я не заканчиваю свои ответы. Я добирался до того 8-) –  slm♦ 10.10.2013, 23:31
  • 3
    , Извините, не понял, что Вы все еще редактировали :D –  kurtm 10.10.2013, 23:32
  • 4
    @slm, что делает - означает в команде вставки? –  bernie2436 10.10.2013, 23:49
  • 5
    @akh2103 - см. мое примечание о -. –  slm♦ 10.10.2013, 23:59

$(command) выполняет команду и заменяет ее выводом.

{ list; } команда группы, выполняя несколько команд в текущей среде оболочки. Это подобно (list), но это не делает подоболочку.

\command используется для игнорирования псевдонимов к командам, которые могут измениться, команды значительно ожидали поведение.

\ в конце строки просто означает, что эта строка продолжается, таким образом, оболочка будет рассматривать следующую строку как часть текущей. Обычно не необходимый, когда это очевидно из контекста (открывающая скобка или кавычка).

3
27.01.2020, 20:34
APPCLASSPATH=$CLASSPATH:$({ \
    \ls -1 "$VOLTDB_VOLTDB"/voltdb-*.jar; \
    \ls -1 "$VOLTDB_LIB"/*.jar; \
    \ls -1 "$VOLTDB_LIB"/extension/*.jar; \
} 2> /dev/null | paste -sd ':' - )

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

ls команды, названные с существующими именами файлов как аргументы, перечисляют свои аргументы, один на строку. Опция -1 не имеет никакого эффекта начиная с вывода ls идет в канал а не в терминал. Если ls получает аргумент, который не является названием существующего файла, оно ничего не отображает на своем стандартном выводе и отображает ошибку вместо этого. Ошибки от ls команды не перенаправляются к нигде 2> /dev/null. Существует две причины почему ls мог бы получить аргумент, который не является файлом: если одна из переменных не обращается к существующему, читаемому каталогу, или если нет никакого файла, соответствующего подстановочному шаблону. В любом случае шаблон передается нерасширенный до ls.

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

Фигурные скобки {…} группируют команды. Составная команда { \ls …; \ls …; \ls … ; } передается по каналу в paste и перенаправили его ошибки к /dev/null.

paste управляйте присоединяется ко всем входным строкам с a : промежуточный. Это эквивалентно tr '\n' : за исключением того, что это не помещает a : в конце.

Замена команды $(…) вызывает вывод paste быть интерполированным в APPCLASSPATH, после значения CLASSPATH переменная с двоеточием для разделения этих двух частей.

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

APPCLASSPATH=$CLASSPATH:$(
  \ls "$VOLTDB_VOLTDB"/voltdb-*.jar "$VOLTDB_LIB"/*.jar "$VOLTDB_LIB"/extension/*.jar |
  tr '\n' :) 2>/dev/null
APPCLASSPATH=${APPCLASSPATH%:}
3
27.01.2020, 20:34

Теги

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