Intereting Posts
Сколько ОЗУ необходимо для предотвращения использования swap? Конфигурирование последовательного порта на Ubuntu для связи с платой Betaflight Как я могу проверить, не прошла ли фоновая работа до ее выхода? Не удалось открыть X-дисплей после изменения имени хоста Мониторинг и предупреждение пользователя при изменении настроек stty? Очистка хром-файлов cookie с сайта при загрузке? Могу ли я изменить выходной формат «последней» команды для отображения года? Как убедиться, что заставка не срабатывает при просмотре фильма? Загрузить файл на ftp-сервер, используя команды в сценарии оболочки? Как разделить изображения с помощью ImageMagick? Я убиваю процесс, но возвращаюсь Служба dropbox не работает или преуспевает в зависимости от времени, проведенного на экране входа Сеанс X-сервера CentOS7 зависает при отслеживании (или любой другой печати) большого количества данных через ssh Как добавить Xft suppport в dwm? Как тянуть зависимости для пакета / тестирования от тестирования

Как шаблон «<(cmd)» работает в bash?

В Bash я использую аргументы, которые выглядят как

paste <(cat file1 | sort) <(cat file2 | sort) 

или же

 comm <(cat file1 | sort) <(cat file2 | sort) 

Когда я проверяю man comm или man paste , в документации говорится, что args – это действительно FILES.

Вопрос:

  1. Создаются ли промежуточные временные файлы (в файловой системе TEMP или в другом месте на более медленном диске) для <(cat file1 | sort) и <(cat file2 | sort) ?

  2. Как называется эта <( ) магия? (посмотреть его документацию)

  3. Это специфично для bash или работает через другие оболочки?

Это называется процессом замещения.

3.5.6 Замена процесса

Замена процесса позволяет ссылаться на вход или выход процесса, используя имя файла.

Список процессов запускается асинхронно, а его ввод или вывод отображается в виде имени файла. Это имя файла передается в качестве аргумента текущей команде в результате расширения. Если используется форма> (список), запись в файл обеспечит ввод для списка. Если используется форма <(list), файл, переданный в качестве аргумента, следует прочитать, чтобы получить вывод списка. Обратите внимание, что между <или> и левой круглой скобкой не должно быть пробела, в противном случае конструкция будет интерпретирована как redirect. Подстановка процессов поддерживается в системах, которые поддерживают именованные каналы (FIFO) или метод / dev / fd именования открытых файлов.

Это не просто bash, как изначально появилось в ksh, но и не в стандарте posix.

Под капотом у процесса замещения есть две реализации. В системах, которые поддерживают /dev/fd (большинство Unix-подобных систем), он работает, вызывая системный вызов pipe( ), который возвращает файловый дескриптор $fd для нового анонимного канала, а затем создает строку /dev/fd/$fd и подставляет это в командной строке. В системах без поддержки /dev/fd он вызывает mkfifo с новым временным именем файла для создания именованного канала и заменяет это имя файла в командной строке.

Вы можете считать <( somecommand ) именем файла временного файла, содержащего выходные данные somecommand . Другими словами,

 utility < <( somecommand ) 

это ярлык для

 somecommand >tempfile utility  

А также

 utility <( somecommand ) 

это ярлык для

 somecommand >tempfile utility tempfile # notice the lack of redirection here (utility expected to read from "tempfile") rm -f tempfile 

Аналогично >( somecommand ) может рассматриваться как имя файла временного файла, который будет somecommand в somecommand при его стандартном вводе. Другими словами,

 utility > >( somecommand ) 

это ярлык для

 utility >tempfile somecommand  

А также

 utility >( somecommand ) 

может быть ярлыком для

 mkfifo temppipe somecommand  

(или что-то подобное)