woof não funciona com arquivos cujos nomes contenham espaços ou colchetes

0

Eu escrevi um script bash e coloquei em ~/.local/share/nautilus/scripts/ .

No nautilus, se eu clicar com o botão direito no arquivo e selecionar o menu de script, ele iniciará o servidor http para compartilhar o arquivo atual, e um código QR será exibido, para que o celular possa verificar o URL para baixar o arquivo. O servidor irá parar quando você fechar a janela do pic.

Tudo funciona, mas quando nomes de arquivos contêm espaço ou colchetes, não consigo baixar o arquivo.

▶ cat ~/.local/share/nautilus/scripts/share-http.bash 
#!/bin/bash

port=8080
pkill woof
file='echo -n $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS|sed 's/\ *$//'|sed 's/\ /\\ /g''
echo $file >> ~/tmp
woof -c 4 -p $port \'$file\' &
# woof -c 4 -p $port $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS &
url='ifconfig|awk '/inet /&&!/127./{print $2}'|sed 's/.*://''
qrencode -s 5 -o /tmp/url.png "http://$url:$port"
eog /tmp/url.png && pkill woof

Este script precisa de woof + qrencode para ser executado.

Eu acho que a string $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS tem um espaço de sufixo, então modifico o código.

No bash, isso deve funcionar:

▶ woof -c 4 -p 8080 '/home/eexp/Download/IMG_20161024_132 037.jpg'

mas ainda falha. Você vê que os comandos em ps possuem apóstrofe, mesmo que haja barras invertidas antes do espaço.

▶ pgrep woof
13109 /usr/bin/python /usr/bin/woof -c 4 -p 8080 '/home/eexp/Download/IMG_20161024_132 037.jpg'
▶ pgrep woof
13531 /usr/bin/python /usr/bin/woof -c 4 -p 8080 '/home/eexp/Download/IMG_20161024_132\ 037.jpg'
    
por utopic eexpress 09.11.2016 / 07:15

2 respostas

1

No GNU / Linux, nada, exceto / e \ (ASCII NUL), é permitido como um caractere constituinte válido para o nome do arquivo. Portanto, espaço, tabulação e até nova linha são caracteres constituintes válidos de nome de arquivo. Quando você tem qualquer nome de arquivo, você precisa usar qualquer mecanismo de escape trivial para obter o significado literal do (s) caractere (s).

Por exemplo, para um nome de arquivo como:

foo bar spam.txt

você pode usar aspas simples, aspas duplas ou foo $bar spam.txt para escapar dos espaços:

'foo bar spam.txt'
"foo bar spam.txt"
foo\ bar\ spam.txt

aspas simples são recomendadas com um nome de arquivo como $bar se você usar aspas duplas, o shell levará $ como uma expansão variável, o mesmo vale para \ sem escape enquanto estiver usando IFS .

Sem escape, o shell executará a divisão de palavras com base nos valores da variável de ambiente * (espaço, guia, nova linha por padrão) e expansão do nome de caminho na string (se houver ? , [] , $file no nome do arquivo).

No caso de uma variável, você precisa duplicar a expansão da variável:

file='foo bar spam.txt'
echo "$file"

O %code% simples cairá novamente na divisão de palavras (e na expansão do nome do caminho).

    
por heemayl 09.11.2016 / 07:23
0

Eu resolvi isso. Este $ NAUTILUS_SCRIPT_SELECTED_FILE_PATHS tem um sufixo "\ x0A", portanto atualizo o script e tudo está OK.

#!/bin/bash

port=8080
pkill woof
file='echo -n $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS|sed 's/\x0A//g''
echo "->$file<-" >> ~/tmp
woof -c 4 -p $port "$file" &
url='ifconfig|awk '/inet /&&!/127./{print $2}'|sed 's/.*://''
qrencode -s 5 -o /tmp/url.png "http://$url:$port"
eog /tmp/url.png && pkill woof
    
por utopic eexpress 09.11.2016 / 15:23