Передача файлов между двумя машинами Ubuntu по ftp

Следует отметить, что подстановка процесса не ограничивается формой <(command), которая использует выходные данные commandв виде файла. Это может быть форма >(command), которая также подает файл в качестве входных данных для command. Это также упоминается в цитате руководства bash в ответе @enzotib.

Для приведенного выше примера date | catкоманда, использующая подстановку процесса формы >(command)для достижения того же эффекта, будет

date > >(cat)

Обратите внимание, что >перед >(cat)необходимо. Это снова можно ясно проиллюстрировать echo, как в ответе @Caleb.

$ echo >(cat)
/dev/fd/63

Таким образом, без дополнительного >date >(cat)будет таким же, как date /dev/fd/63, которое напечатает сообщение в stderr.

Предположим, у вас есть программа, которая принимает в качестве параметров только имена файлов и не обрабатывает stdinили stdout. Я буду использовать упрощенный сценарий psub.sh, чтобы проиллюстрировать это. Содержимое psub.sh

#!/bin/bash
[ -e "$1" -a -e "$2" ] && awk '{print $1}' "$1" > "$2"

По сути, он проверяет, что оба его аргумента являются файлами (, не обязательно обычными файлами ), и если это так, записывает первое поле каждой строки "$1"в "$2"с помощью awk. Затем команда, которая сочетает в себе все, что упоминалось до сих пор,

./psub.sh <(printf "a a\nc c\nb b") >(sort)

Будет напечатано

a
b
c

и эквивалентно

printf "a a\nc c\nb b" | awk '{print $1}' | sort

но следующее не будет работать, и мы должны использовать подстановку процесса здесь,

printf "a a\nc c\nb b" |./psub.sh | sort

или эквивалентная форма

printf "a a\nc c\nb b" |./psub.sh /dev/stdin /dev/stdout | sort

Если ./psub.shтакже читается как stdinпомимо упомянутого выше, то такой эквивалентной формы не существует, и в таком случае мы ничего не можем использовать вместо подстановки процесса (конечно можно и использовать именованный канал или временный файл, но это уже другая история ).

0
10.10.2020, 13:09
0 ответов

Теги

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