%20e%20salvo%20em%20uma%20vari%C3%A1vel.png)
Se eu executar na CLI:
curl time.com | sed -n 's/.*href="\([^"]*\).*/\1/p' | tr " " "\n"
então, como esperado, recebo uma lista de links higienizados da página para STDOUT
, cada um em uma nova linha.
No entanto, quando eu salvo isso em uma variável e tento echo
isso de um script.sh
:
PAGE_LINKS=$(curl time.com | sed -n 's/.*href="\([^"]*\).*/\1/p' | tr " " "\n")
echo $PAGE_LINKS
Eu recebo todos os links em uma linha, separados por espaço. Então, como se isso tr
fosse ignorado.
Eu tentei várias coisas, incluindo algo como
HREFS=$(tr " " "\n" < "{PAGE_LINKS}")
echo $HREFS
Mas então recebo file too long
um erro. Alguma sugestão?
Responder1
De acordo com a bash
página de manual da $(command)
construção:
Bash executa a expansão executando o comando e substituindo a substituição do comando pela saída padrão do comando, com todas as novas linhas finais excluídas. As novas linhas incorporadas não são excluídas, mas podem ser removidas durante a divisão de palavras.
Portanto tr
, não é o problema, mas bash
exclui as novas linhas, se elas estiverem no final, e remove quaisquer outras novas linhas durante a divisão do Word. Este é o comportamento documentado.
Acredito que você queira esse comportamento na maioria dos lugares. Se você tiver um arquivo com uma lista de nomes de arquivos, então:
for FILENAME in $(cat somefile)
do
...
done
Itera sobre a lista de nomes de arquivos. Você não gostaria que as novas linhas somefile
atrapalhassem sua lista de palavras para usar como nomes de arquivos e talvez até atrapalhassem seu loop de tarefas concluídas.
Responder2
O problema não é tr
, o problema reside em como você está gerando a expansão da variável:
echo $PAGE_LINKS
Cite a expansão variável:
echo "$PAGE_LINKS"
caso contrário, a expansão passará pela divisão de palavras de acordo com o valor de IFS
(espaço, tabulação, nova linha por padrão) e expansão do nome do caminho ( *
, ?
, []
).
No seu caso, a divisão do Word está acontecendo, e cada elemento separado por nova linha está sendo considerado individualmente e, finalmente, mostrado como entidades separadas por espaço. O uso de aspas evitará a divisão de palavras (e a expansão do nome do caminho), portanto, toda a expansão será considerada uma única entidade.