Heredocument de linha única - Possível em Bash?

0

Desejo executar um cat heredocument em uma única linha, em vez da sintaxe natural de 3 linhas (abridor, conteúdo e delimitador). Minha necessidade de fazer isso é principalmente estética, já que o conteúdo redirecionado visava fazer parte de um arquivo de texto do manual e eu gostaria de salvar o máximo de linhas possível nesse arquivo em particular).

Fazer cat <<< TEST > ~/myRep/tiesto tiesto TEST (o que normalmente dividiria em 3 partes) resultará em erros:

tiesto: No such file or direcotry

TEST: No such file or directory.

É possível executar heredocumentos de uma linha no Bash?

    
por JohnDoea 09.06.2017 / 05:17

2 respostas

7

Sim, mas você estaria usando um aqui. string em vez de um aqui-documento :

cat >"$HOME/myRep/tiesto" <<<'tiesto'

Isso enviará a string tiesto para cat em sua entrada padrão e gravará a string no arquivo $HOME/myRep/tiesto por meio de um redirecionamento de sua saída padrão.

Observe que as strings aqui não são padrão, mas são implementadas por pelo menos zsh (de onde vem, ao mesmo tempo que a versão UNIX de rc , embora rc e suas derivadas como es ou akanga não adicionam um caractere extra de nova linha no final), ksh93 , bash , mksh e yash .

    
por 09.06.2017 / 05:44
1

Você pode colocar aqui um documento (em oposição a uma string aqui), em uma única linha, usando:

eval $'cat << TEST > ~/myRep/tiesto\ntiesto\nTEST'

Tecnicamente, essa é uma linha de código, mas o $'...' expandirá para um novo código de 3 linhas que será eval uado novamente.

Usando eval , você sempre pode colocar qualquer código de shell em uma linha.

Com shells que não suportam $'...' , você pode fazer:

eval "$(printf 'NL="\n"')"; eval "cat << TEST > ~/myRep/tiesto${NL}tiesto${NL}TEST"

Ou

eval "$(printf 'cat << TEST > ~/myRep/tiesto\ntiesto\nTEST')"

Claro que aqui,

echo tiesto > ~/myRep/tiesto

seria muito mais simples. Ou para várias linhas:

printf '%s\n' "line 1" "line 2" > ~/myRep/tiesto
    
por 27.08.2018 / 14:23