bash $ (printf “% s \ n”) não cria multilinhas

1

Eu criei o shell script, que efetua login no servidor FTP e renomeia alguns diretórios. Eu coloquei comandos FTP em cadeia de múltiplas linhas como assim

# !/bin/sh

ftp -inv $HOST << EOF
user $USER $PASSWORD
$COMMANDS
bye
EOF

o $COMMANDS contém comandos separados por nova linha. Essa abordagem funciona, quando eu construo o comando assim

NL=$'\n'
COMMANDS="command one$NL"
COMMANDS+="command two$NL"
COMMANDS+="command three"

Em primeiro lugar, tentei preencher $COMMANDS com a função printf , mas mesmo depois de várias tentativas, não obtive êxito. A expressão

COMMANDS="$(printf "%s\n" "command one" "command two" "command three")"

avaliado como string com espaços em branco entre os comandos e quando usado no script como comando FTP, foi processado como uma única linha.

Eu tentei substituir \n por \r , o que resulta na variável $COMMANDS não sendo preenchida com nenhuma string.

Alguém mais instruído por favor me explica, qual é o problema com a função printf aqui?

Atualizar

Eu gerenciei como alcançar meu objetivo via rsync, então a abordagem de FTP que abandonei, mas ainda estou curioso para saber por que isso acontece.

O problema é com o armazenamento de printf na variável. Fiz script de teste:

echo "==== printf directly"
printf "%s\n" "foo" "bar" "baz"

echo "==== stored in variable"
VAR_1=$(printf "%s\n" "foo" "bar" "baz")
echo $VAR_1

executando ./test.sh outputs

==== printf directly
foo
bar
baz
==== stored in variable
foo bar baz

definir IFS=$'\n' não ajuda.

Atualização 2

Eu posso obter multilinha da variável se eu envolvê-lo em qotes duplos

echo "$VAR_1"

mas não consigo obter o mesmo resultado se usado dentro do heredoc

echo 'cat <<EOF
$VAR_1
"$VAR_1"
EOF'

Eu recebo saída

foo bar baz "foo bar baz"

nota: não há sequer uma nova linha entre os dois outputs variáveis em heredoc, o que também é estranho para mim.

    
por Vaclav 21.02.2015 / 13:59

1 resposta

1

echo come as novas linhas quando você não usa aspas.
EDIT: Veja comentário, não é ecoado falha.

Você já encontrou a melhoria

echo "$VAR_1"

Agora faça o mesmo para o documento aqui:

echo "'cat <<EOF
$VAR_1
EOF'"
    
por 25.02.2015 / 22:05

Tags