Quoting in command replacement

1

O comando

pdftk FileOne.pdf "File two.pdf" output Combined.pdf  

funciona como esperado, mesclando o One e o Two do PDF. No entanto, se eu colocar os nomes de arquivos em um arquivo

FileOne.pdf 
"File Two.pdf"  

e, em seguida, use

pdftk $(< Files.lst) output Combined.pdf  

Eu recebo as mensagens de erro

Error: Failed to open PDF file: 
   "File  
Error: Unable to find file.
Error: Failed to open PDF file: 
   Two.pdf"  

Obviamente, pdftk está vendo as aspas, então eu não entendo como isso pode distinguir os dois casos (e é por isso que estou colocando a questão neste fórum).

Para o registro, estou usando o shell MKS Toolkit Korn, invocado pelo Emacs. Eu recebo o mesmo no shell bash do Cygwin.

    
por Michael 14.12.2013 / 14:24

3 respostas

2

Escreva o arquivo como:

FileOne.pdf 
File Two.pdf

E use como:

set -f
IFS='
' # split on newline only
pdftk $(< Files.lst) output Combined.pdf
    
por 14.12.2013 / 15:38
0

Você tem dois problemas (pelo menos).

O primeiro é que você precisa ler o seu arquivo de origem (Files.list) uma linha de cada vez. Provavelmente você pode fazer isso mais de uma maneira, mas uma delas é com read

Veja: link

O segundo é devido aos espaços em seus nomes de arquivos (resultando no erro "Falha ao abrir o arquivo PDF: Two.pdf"). Você precisa citar suas variáveis ou escapar do espaço.

, portanto, qualquer um dos itens a seguir funciona com espaços no nome do arquivo,

echo "$variable"
cat "File with spaces.txt" 
cat 'File 2.txt'
cat File\ 3\ with\ spaces.txt

Existe uma solução elegante aqui:

link

    
por 14.12.2013 / 17:10
0

Você pode remover as aspas do arquivo de texto e lê-lo em uma matriz com mapfile :

do bash
mapfile -t files < Files.lst
pdftk "${files[@]}" output Combined.pdf  
    
por 14.12.2013 / 22:23