Я в настоящее время не могу думать о способе достигнуть того, что Вы хотите, не включая корень. Так: Свяжитесь со своим системным администратором и получите второй счет на Ваше приложение.
Это не имеет значения потому что оба 4>&1
и 4<&1
сделайте то же самое: dup2(1, 4)
который является системным вызовом для дублирования fd на другого. Дублированный fd автоматически наследовал направление ввода-вывода исходного fd. (то же для 4>&-
по сравнению с 4<&-
который обе твердости к close(4)
, и 4>&1-
который является dup2(1, 4)
сопровождаемый close(1)
).
Однако 4<&1
синтаксис сбивает с толку, если по некоторым причинам fd 1 не был явно открыт для чтения (который будет еще более сбивать с толку), таким образом, в моем уме должен будет избежаться.
Дублированный fd
совместно использует то же открытое описание файла, что означает, что они совместно используют то же смещение в файле (для тех типов файлов, где это имеет смысл), и те же связанные флаги (режим перенаправления/открытия ввода-вывода, O_APPEND и так далее).
На Linux существует другой способ копировать a fd
(который не является действительно дублированием), и создайте новое открытое описание файла для того же ресурса, но с возможно различными флагами.
exec 3> /dev/fd/4
В то время как на Солярисе и вероятно большинстве других Нельдов, который более или менее эквивалентен dup2(4, 3)
, на Linux, который открывает тот же ресурс как, на который указывает fd 4 с нуля.
Это - важное различие, потому что, например, для регулярного файла, смещение fd 3 будет 0 (начало файла), и файл будет усеченным (который является, почему, например, на Linux необходимо записать tee -a /dev/stderr
вместо tee /dev/stderr
).
И режим I/O может отличаться.
Интересно, если fd 4 указал на конец чтения канала, то fd 3 теперь указывает на конец записи (/dev/fd/3
ведет себя как именованный канал):
$ echo a+a | { echo a-a > /dev/fd/0; tr a b; }
b+b
b-b
$ echo a+a | { echo a-a >&0; tr a b; }
bash: echo: write error: Bad file descriptor
b+b