
В bash мы можем создать связь между файловым дескриптором и файлом, например, с помощью
exec > /path/to/myfile
который подключает fd 1 к файлу.
Мне было интересно, как мы можем отключить fd от любого файла, подключенного к нему, так, чтобы fd не был подключен ни к одному файлу? Обратите внимание, что /dev/null
и /dev/tty
являются файлами.
Спасибо.
Моя цель — выяснитьПодключает ли оболочка автоматически файловые дескрипторы 0, 1 и 2 к своему управляющему терминалу?, отключив fd 0, 1 и 2 в bash, перед запуском bash
в той же оболочке bash.
решение1
Вам нужно закрыть файловый дескриптор, что в оболочке типа Bourne делается с помощью оператора >&-
(по умолчанию fd 1) или <&-
(по умолчанию fd 0):
exec >&-
exec 1>&-
exec 1<&-
все они эквивалентны и приводят к close(1)
выполнению системного вызова.
Обратите внимание, что, как правило, закрывать файловые дескрипторы 0, 1 и 2 — плохая идея, так как большинство команд ожидают, что они открыты (это их stdin, stdout и stderr), и открытие ими файла может привести к тому, что этот файл непреднамеренно станет их stdin/stdout/stderr, и то, что они выведут на stdout или stderr, может оказаться записанным в эти файлы.