Estou executando o seguinte comando:
some_command --flag "foo\
bar\
quux" arg2
Isso faz com que a string seja passada como foo\tbar\tquux
.
Estou procurando uma maneira de passar esse argumento sem ser caracteres de tabulação (ou outros caracteres de espaço em branco adicionados) mantendo o recuo (para tornar meu script legível).
faria isso, embora não seja o mais legível. Isso passa "foo", "bar" e "quux" como argumentos para o
printf
comando com%s
a string de formato. Quando menos caracteres de formato são fornecidos do que argumentos, a string de formato é repetida conforme necessário, tornando isso equivalente a%s%s%s
, ou todas as três strings impressas uma após a outra sem espaços entre elas. Finalmente, a saída doprintf
comando, "foobarquux", é substituída como argumento parasome_command
.Usando uma função auxiliar:
Isso produziria
Ou, colocando os bits de string do argumento em um array primeiro, depois criando o argumento real separadamente (supõe o uso de um shell que tenha arrays):
O mesmo que acima com um shell POSIX:
Observe que o corpo da função é
concat
executado em seu próprio subshell (é isso que(...)
faz), o que significa que a alteraçãoIFS
é local para a função.A justificativa para usar
"$*"
em vez de"$@"
na função é puramente estética. O"$*"
será expandido para uma única string queprintf
será impressa. A concatenação real neste caso é realizada pela expansão do shell$*
sem delimitador (empty$IFS
). Usar"$@"
em vez disso expandiria para um número de strings individuais queprintf
aplicariam repetidamente sua string de formato. A concatenação seria, neste caso, um efeito colateral de usar a string de formato específica comprintf
.Ou, a mesma ideia (criar a string de argumento real separadamente), mas sem essa função auxiliar,
printf '"%s"\n'
acima seria em todos os casos substituído por seusome_command --flag
.