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 -1
com seu stdout redirecionado para esse canal.
Então read
armazenará na $bytes
variável a primeira palavra da última linha da saída de du -bcm
e o restante da linha na $_
variável.
Agora não sei onde isso du -bcm
faz sentido. Nenhuma das -b
opções -c
nem -m
é padrão. Embora -c
seja 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 -b
por 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 read
builtin. 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 bytes
será 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 oreadonly
atributo 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.