Помогите мне понять сложную подстановку команд с помощью {} и нескольких `\ ls`

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

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

Я сравнительный linux noob, пытающийся прочитать некоторые сложные сценарии оболочки, поэтому небольшая помощь будет отличной.

3 Solutions collect form web for “Помогите мне понять сложную подстановку команд с помощью {} и нескольких `\ ls`”

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

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

ПРИМЕЧАНИЕ . Переменные $VOLTDB_VOLTDB и $VOLTDB_LIB будут расширены, и может быть больше значений, чем только один файл для каждой из этих команд ls . Смотрите * там? Это символ glob, который действует как подстановочный знак и расширяется до любой точки слева (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 и печатает каждый аргумент, когда он входит, и разделяется символом :

С помощью разных переключателей для 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 сколько папок аргументов должно печатать на каждой строке. Но не путайте, пример, с которым вы имеете дело, просто берет ввод из STDIN, разделяя каждый аргумент на пробелы и печатая его, а затем : Когда вы даете несколько - вы говорите paste чтобы принимать аргументы, 2 и время, 3 за раз и т. Д.

Аргументы 2 за раз, разделенные : 's:

 $ 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 

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

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

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

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

 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 … ; } { \ls …; \ls …; \ls … ; } { \ls …; \ls …; \ls … ; } передается в paste и имеет свои ошибки, перенаправленные на /dev/null .

Команда paste объединяет все входные строки с : между ними. Это эквивалентно 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%:} 
  • Строим пути
  • Поиск последнего символа имени базового файла
  • Как проверить входной параметр для запуска сценария оболочки
  • Shell Scripting: Сравнивая что-то с ничем?
  • bash не сравнивает имена файлов с правильно
  • Проверка того, нажата ли конкретная клавиша в сценарии оболочки
  • #! / bin / bash exponent
  • Как выполнить команду, которая находится в переменной
  • Как отфильтровать некоторые файлы из моего каталога?
  • Почему комментирование этой строки в сценарии оболочки (с использованием pdftk) вызывает проблемы?
  • при чтении строки в сценарии оболочки - как остановить цикл?
  • Linux и Unix - лучшая ОС в мире.