Помогите мне понять сложную подстановку команд с помощью {} и нескольких `\ 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%:} 
  • Как автоматизировать повторяющийся процесс с использованием сценариев оболочки
  • тянущие линии, связанные с датой
  • создать цикл из файла
  • Конкатенация строковой переменной внутри цикла for в оболочке bash
  • Выполнить список команд с контрольной точкой?
  • Shell сценарий синтаксические ошибки messsages "неожиданный конец файла" и "неожиданный EOF при поиске соответствия` "'"
  • Тихая установка сценария оболочки с использованием файла bash
  • if else в одной строке с использованием && и ||
  • Портативный способ настройки исполняемого файла, вызванного скриптом
  • Форматирование и отображение интервала с дробными секундами в оболочке
  • как проверить каталог пуст
  • Interesting Posts

    В чем разница между

    Указать конкретную опцию из ответа в dhclient

    Определить имя статической / динамической библиотеки

    Идентификация открытых и закрытых IP-адресов / портов сервера

    В PCManFM можно запустить и подключиться к SFTP-серверу?

    Когда я запускаю `./command.sh &`, фоновая задача приостанавливается. Как я могу продолжать работать?

    Как началась функция ~ / .local / bin? Насколько распространено это?

    скачать pdf-файлы с помощью curl

    Где продолжение строки bash после && и || документально?

    Связь с устройством теряется при запуске сети при загрузке?

    В чем разница между форматом qcow2 и img?

    Нет страницы руководства для регулярного выражения в разделе 3 – где это?

    Основной / младший номер устройства для удаленной файловой системы

    Настройка почтового сервера только для приема и обработки входящих сообщений и вложений

    Как `apt` отличается от` apt-get`?

    Linux и Unix - лучшая ОС в мире.