Значение символов стрелок в дублировании/закрытии дескрипторов файлов под ударом

Я в настоящее время не могу думать о способе достигнуть того, что Вы хотите, не включая корень. Так: Свяжитесь со своим системным администратором и получите второй счет на Ваше приложение.

3
17.02.2013, 19:57
1 ответ

Это не имеет значения потому что оба 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
2
27.01.2020, 21:28

Теги

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