Что означает минус в «exec 3> & -» и как его использовать?

У меня часто возникают проблемы с определением определенных языковых конструкций, потому что они не будут регистрироваться при поиске в googling или duckduckgoing. С небольшим количеством экспериментов часто бывает сложно понять это, но я не понимаю этого.

I often see stuff like 2>&1 or 3>&- in bash scripts. I know this is some kind of redirection. 1 is stdout and 2 is stderror. 3 is probably custom. But what is the minus?

Also, I have a script whose output I want to log, but also want to see on screen. I use exec > >(tee $LOGFILE); exec 2>&1 for that. It works. But sometimes when I bashtrap this script, I cannot type at the prompt anymore. Output is hidden after Ctrl+C. Can I use a custom channel and the minus sign to fix this, or is it unrelated?

6
nl ja de
У вас есть два точных ответа. Документ Программирование Csh, считающийся вредоносным , также охватывает использование эти обозначения и объясняют, почему морские раковины следует оставлять на морском берегу и не использовать для написания сценариев.
добавлено автор Jonathan Leffler, источник

2 ответы

  1. 2>&1 means that stderr is redirected to stdout
  2. 3>&- means that file descriptor 3, opened for writing(same as stdout), is closed.

You can see more examples of redirection here

  1. Что касается вопросов номер 3, я думаю, что это является хорошей ссылкой.
6
добавлено

The 3>&- close the file descriptor number 3 (it probably has been opened before with 3>filename).

The 2>&1 redirect the output of file descriptor 2 (stderr) to the same destination as file descriptor 1 (stdout). This dies call dup2() syscall.

Для получения дополнительной информации о перенаправлении дескриптора файла обратитесь к файлам bash (`man bash). Они плотные, но великие.

Для вашего скрипта я сделал бы это так:

#!/bin/bash
if [[ -z $recursive_call ]]; then
  recursive_call=1
  export recursive_call
  "$0" "[email protected]" | tee filename
  exit
fi
# rest of the script goes there

Однако он теряет код выхода из сценария. В bash есть способ получить его, я думаю, но я не могу его запомнить.

4
добавлено
pro.bash
pro.bash
123 участник(ов)

All about Nix shells, signals, processes and development in general.