Наскільки я можу бачити, exec 3>&-
і exec 3<&-
те ж саме і може бути використаний на будь-якому файлі дескриптора, незалежно від того, як він був відкритий. Відповідно до розділів 2.7.6 та 2.7.5 визначення POSIX мови командної оболонки :
2.7.5 Копіювання дескриптора вхідного файлу
Оператор перенаправлення:
[n] <& слово
[... SNIP ...]
Якщо слово оцінюється на '-', дескриптор файлу n або стандартне введення, якщо n не вказано, закриваються. Спроби закрити дескриптор файлу, який не є відкритим, не становлять помилку. Якщо слово оцінює щось інше, поведінка не визначено.
2.7.6 Дублювання дескриптора вихідного файлу
Оператор перенаправлення:
[n]> & слово
[... SNIP ...]
Якщо слово оцінюється на '-', дескриптор файлу n або стандартний висновок, якщо n не вказано, закрито. Спроби закрити дескриптор файлу, який не є відкритим, не становлять помилку. Якщо слово оцінює щось інше, поведінка не визначено.
Зауважте, що жодне не вказує нічого про те, як спочатку відкривався дескриптор файлу n. Це відповідає тому, що close (2) не переймається тим, як ви відкрили файл.
Швидкий перелік наступного:
exec 3< /etc/passwd
exec 4> foo
exec 3<&-
exec 4<&-
проти цього:
exec 3< /etc/passwd
exec 4> foo
exec 3<&-
exec 4>&-
показує, що в обох випадках Баш робить точно те саме.
Два поважно цікавих факти
>&-
і<&-
- fd за замовчуванням, коли не вказано (>&-
є,1>&-
поки<&-
є0<&-
). Те саме, дляx>&y
якого те саме, щоx<&y
за винятком випадків, колиx
це не передбачено.