Porque é assim que o ZSH é escrito. ZSH por padrão duplica um descritor de arquivo para fd 10:
$ PS1='%% ' zsh -f
% lsof -p $$ | grep 10u
zsh 29192 jhqdoe 10u CHR 136,0 0t0 3 /dev/pts/0
%
E código relacionado a fd subsequente em Src/exec.c
chamadas movefd
/**/
static void
addfd(int forked, int *save, struct multio **mfds, int fd1, int fd2, int rflag,
char *varid)
{
int pipes[2];
if (varid) {
/* fd will be over 10, don't touch mfds */
fd1 = movefd(fd2);
if (fd1 == -1) {
zerr("cannot moved fd %d: %e", fd2, errno);
return;
que em Src/utils.c
a duplicata-para-a-próxima-disponível-acima-10-que-já-foi-tomada-por-padrão-assim-a-primeira-você-verá-é -11 coisa:
movefd(int fd)
{
if(fd != -1 && fd < 10) {
#ifdef F_DUPFD
int fe = fcntl(fd, F_DUPFD, 10);
#else
int fe = movefd(dup(fd));
#endif
Meu zsh
de acordo com strace
está usando o caminho do código fcntl
, embora eu suspeite dos comentários de que fcntl(...
ou movefd(dup(...
resultará em novo fd começando em 11; 10 não está disponível, pois o zsh, por padrão, contém uma duplicata nesse número.
Tudo o que o {somelabel}
faz é obter o menor descritor de arquivo disponível maior que 10; isso pode ser 11 ou pode ser um número maior dependendo do que mais o shell já tem aberto:
% exec {foo}>asdf
% echo $foo
11
% exec {quer}>asdf
% echo $quer
12
...