usando _< em vez de < para stdin usando bash

usando _< em vez de < para stdin usando bash

Qual é a diferença entre usar _<e <for stdin ao usar a substituição de processo. Isso é feito usando o bash.

Exemplo:

read bytes _< <(du -bcm random_iso.iso | tail -1); echo $bytes

Responder1

Isso não é um _<operador, é um _argumento a ser passado para leitura e o <operador de redirecionamento. <(cmd)em si é uma substituição de processo (que se expande para um nome de arquivo que aponta para um canal).

O que isso faz é executar:

read bytes _  < /proc/self/fd/x

Onde fd x é a extremidade de leitura de um tubo.

Na outra extremidade (escrita) do canal, um processo de subshell em segundo plano está sendo executado du -bcm random_iso.iso | tail -1com seu stdout redirecionado para esse canal.

Então readarmazenará na $bytesvariável a primeira palavra da última linha da saída de du -bcme o restante da linha na $_variável.

Agora não sei onde isso du -bcmfaz sentido. Nenhuma das -bopções -cnem -mé padrão. Embora -cseja bastante comum e sirva para fornecer o tamanho cumulativo, com GNU du, -bé obter o tamanho do arquivo (não o uso do disco) em bytes, enquanto -mé necessário arredondar o tamanho para o próximo mebibyte, para que sejam opções conflitantes (embora talvez eles usaram -bpor seu efeito colateral de ativar --apparent-size). FreeBSD du tem -m(para mebibytes), não -b, Solaris não tem nenhum...

Parece que foi concebido como uma forma complicada de escrever:

wc -c < random_iso.iso

Ou:

du --apparent-size -cm random_iso.iso | awk 'END{print $1}'

Se eles realmente quisessem que o tamanho do arquivo fosse arredondado para o próximo mebibyte em um sistema GNU.

Responder2

Como mencionado, _<não é um redirecionamento. Isso está passando _como argumento final para read. O <é então interpretado como um operador de redirecionamento separado, redirecionando a saída da substituição do processo para stdin.

Tornou-se convencional em scripts Bash usar _como uma "variável descartável" em conjunto com o readbuiltin. No bash, _é uma variável especial que é definida como o argumento final de um comando após cada comando ser executado. Neste caso, significa que bytesserá atribuído o primeiro campo, e os campos restantes serão descartados na _variável, em vez de atribuir todos os campos restantes em bytes.

Embora esta seja uma convenção, há uma série de boas razões para evitar abusos _desta forma.

  • Este comportamento _não é especificado pelo POSIX. A maioria dos shells não fará nada de especial com isso.
  • Em zsh, _possui o readonlyatributo e usá-lo fará com que o shell gere um erro.
  • Em mksh, _só tem comportamento do bash no modo interativo. Em um script não interativo, _é usado para uma finalidade diferente e não recebe nada após cada comando.
  • in ksh93, _é definido apenas como o último argumento do último comando em uma linha. Os comandos devem estar fisicamente localizados em linhas de código separadas para serem usados _. Além disso, _no ksh93 está sobrecarregado para ter muitos outros usos em vários contextos, portanto, atribuir a _para esse propósito não é recomendado e fará coisas diferentes dependendo do contexto.

Recomendo colocar um espaço antes de um redirecionamento para deixar as coisas mais claras. Coloquei algumas diretrizes sobre um bom estilo de redirecionamento emEste artigo.

informação relacionada