Eu quero substituir o gato:
var=$(cat "filename" 2>/dev/null)
pela sintaxe bashism:
var=$(<"filename")
O problema é que não sei como silenciar o bashism para evitar tais advertências:
bash: filename: No such file or directory
Eu tentei isso:
var=$(2>/dev/null <"filename")
mas não lê var
mais os arquivos existentes.
Envolver a atribuição em um bloco composto e usar um redirecionamento parece funcionar:
por exemplo
Apenas não use
( .. )
para criar um subshell, pois a variável atribuída seria perdida.Teste primeiro para garantir que esteja disponível e legível:
O
-f
teste testa se sefilename
refere a um arquivo regular e o-r
teste testa se ele pode ser lido por você.Outra maneira é primeiro verificar se o arquivo existe e, em seguida, lê-lo na variável.
Para referência:
em
zsh
, você pode usar a$mapfile
matriz associativa especial que mapeia para o conteúdo do arquivo nomeado como a chave (observe que não está relacionado e é anteriorbash
aomapfile
builtin de (que não mapeia arquivos) por uma década ou mais). Ele usammap()
isso só pode ser usado em arquivos regulares.Ele não produz nada se o arquivo não puder ser aberto ou mapeado. Para verificar se há erros, você pode usar a
$ERRNO
variável especial:$ERRNO
os valores podem ser traduzidos paraENOENT
,EACCESS
... códigos com a$errnos
matriz nozsh/system
módulo ou para strings de erro com osyserror
built-inzsh/system
também.Você também pode fazer
mapfile[filename]=$var
para alterar o conteúdo do arquivo, é um verdadeiro mapeamento.Observe que while
$(<filename)
retiraria todos os caracteres de nova linha à direita do conteúdo defilename
,$mapfile[filename]
expande para todo o conteúdo do arquivo (incluindo arquivos binários) como está.