Q1
Вы должны подготовиться к восстановлению, прежде чем выполнять первоначальные exec
:
exec 3>&1 1>file
Чтобы позже восстановить исходный стандартный вывод:
exec 1>&3 3>&-
Первый exec
копирует исходный файловый дескриптор 1 (стандартный вывод) в файловый дескриптор 3, а затем перенаправляет стандартный вывод в указанный файл. Второй exec
снова копирует дескриптор файла 3 в стандартный вывод, а затем закрывает дескриптор файла 3.
Q2
Это немного открытый конец. Его можно описать на уровне кода C или на уровне командной строки оболочки.
exec 1>file
просто перенаправляет стандартный вывод (1) оболочки в указанный файл. Первый дескриптор файла теперь ссылается на именованный файл; любой вывод, записанный в стандартный вывод, попадет в файл. (Обратите внимание, что подсказки в интерактивной оболочке записываются в стандартную ошибку, а не в стандартный вывод.)
exec 1>&-
просто закрывает стандартный вывод оболочки. Теперь нет открытого файла для стандартного вывода. Программы могут расстроиться, если они запускаются без стандартного вывода.
Q3
Если вы закроете все три из стандартного ввода, стандартного вывода и стандартной ошибки, интерактивная оболочка закроется, когда вы закроете стандартный ввод (поскольку она получит EOF при чтении следующей команды). Сценарий оболочки будет продолжать работать, но программы, которые он запускает, могут выйти из строя, потому что им гарантировано 3 открытых файловых канала — стандартный ввод, стандартный вывод, стандартная ошибка — и когда ваша оболочка запускает их, если нет другого перенаправления ввода-вывода. , то они не получат файловые каналы, которые им обещали, и может начаться ад (и единственный способ, которым вы будете знать, это то, что статус выхода команды, вероятно, будет не нулевым — успех).
person
Jonathan Leffler
schedule
24.08.2014
tee
для вывода как в STDOUT, так и в файл, но я не могу быть уверен в том, что вы сказали. - person JayC   schedule 24.08.2014