Como a opção -d para bash lê o trabalho?

4

Eu tenho um script bash onde estou tentando atribuir uma string heredoc a uma variável usando read, e isso só funciona se eu usar read com o -d '' opção, ou seja,

read -d '' <variable>

bloco de script

#!/usr/bin/env bash

function print_status() {
    echo
    echo "$1"
    echo 
}


read -d '' str <<- EOF
    Setup nginx site-config
    NOTE: if an /etc/nginx/sites-available config already exists for this
    website, this routine will replace existing config with template from
    this script. 
EOF

print_status "$str"

Eu encontrei esta resposta em SO que é onde eu copiei o comando, funciona, mas por quê? Eu sei que a primeira invocação de read para quando encontra o primeiro caractere de nova linha, então se eu usar algum caractere que não apareça na string, todo o heredoc será lido, por exemplo

  • read -d '|' <variable> - isso funciona
  • read -d'' <variable> - isso não acontece

Tenho certeza de que é simples, mas o que está acontecendo com essa opção de comando read -d '' ?

    
por the_velour_fog 26.01.2016 / 08:19

2 respostas

7

Eu acho que a pergunta é por que read -d '' funciona apesar de read -d'' não.

O problema não tem nada a ver com read , mas é um "problema" de citação. Um "" / '' que faz parte de uma string (word) simplesmente não é reconhecido. Deixe o shell mostrar o que você vê / executa:

start cmd:> set -x

start cmd:> echo read -d " " foo
+ echo read -d ' ' foo

start cmd:> echo read -d" " foo
+ echo read '-d ' foo

start cmd:> echo read -d "" foo
+ echo read -d '' foo

start cmd:> echo read -d"" foo
+ echo read -d foo
    
por 26.01.2016 / 08:30
2

Seu heredoc é muito mais simples escrito como:

print_status(){ paste -sd\n /dev/null - /dev/null;}

print_status <<\doc
doc body
doc

Você não precisa atribuir tudo isso a um nome. Para esse assunto, mais simplesmente ainda poderia ser:

print_status(){ printf %s\n '' "$@" '';}

print_status \
    'line 2' \
    'line 3' and lines 4,5,6

Meu ponto é que eu acho que é um pouco exagerado escrever um monte de texto em seu arquivo de script que você instrui o shell a ler para um arquivo temporário (que geralmente é como aqui documentos funcionam) e para abrir esse arquivo temporário em stdin de algum comando se o seu comando direcionado é apenas para ser o shell mais uma vez lendo de volta em uma variável! Vejo? É um pouco redundante, na minha opinião.

    
por 27.01.2016 / 02:50