Como carregar um diálogo de lista 'zenity' com dados embutidos em espaço de 'ls'?

5

Estou tendo problemas ao carregar uma caixa de diálogo zenity List quando os dados contêm espaços.

É direto quando não há espaços nos dados listados,
mas eu não sei de um método simples / padrão para nomes de arquivos com espaço embutido.

Por algum motivo, a saída de $ ( ls -Q /tmp ) (saída entre aspas) ainda
divide os nomes dos arquivos em todos os espaços. As aspas e barras invertidas na saída ls | sed parecem ser tratadas como uma "sequência finalizada" em vez de como como "linhas de dados legíveis" (como as duas primeiras linhas de dados) ...

Eu consegui "contornar o problema", mas o código de auto-modificação provavelmente
não é o melhor caminho a percorrer! (mesmo que seja divertido! :)

Aqui está o método que NÃO funciona

zenlist="/tmp/zen list"; touch "$zenlist"
zenity --list --title='A single-column List' --width=600 --height=450 \
--column='Spaces are allowed within "q u o t e s"' \
"How much wood would a woodchuck chuck," \
"if a wooodchuck could chuck wood?" \
$(ls -Q -1 "$zenlist"* |sed 's/$/ \/')
echo ""
# rm "$zenlist"  # Uncomment this line to delete the file

Esse método funciona, mas deve haver uma maneira "convencional" (melhor)!

zenlist="/tmp/zen list"
echo "zenity --list --title='A single-column List' --width=600 --height=450 \" >"$zenlist"
echo "--column='Spaces are allowed within \"q u o t e s\"' \"       >>"$zenlist"
echo "\"How much wood would a woodchuck chuck,\" \"       >>"$zenlist"
echo "\"if a wooodchuck could chuck wood?\" \" >>"$zenlist"
(ls -Q "$zenlist"* |sed 's/$/ \/')   >>"$zenlist"
echo "" >>"$zenlist"
source "$zenlist"
# rm "$zenlist"  # Uncomment this line to delete the file
    
por Peter.O 24.12.2010 / 11:38

2 respostas

5

O problema é ls . Ele nunca foi projetado para ser usado em scripts. Além disso, também é inútil usar ls em scripts, porque o shell pode fazer o trabalho muito melhor, simplesmente usando um glob, veja link

zenlist="/tmp/zen list"; touch "$zenlist" "$zenlist"$'\neven with a newline'
zenity --list --title='A single-column List' --width=600 --height=450 \
       --column='Spaces are allowed within "q u o t e s"' \
       "How much wood would a woodchuck chuck," \
       "if a wooodchuck could chuck wood?" \
       "$zenlist"*

E para uma maneira geral de colocar itens de lista com espaços e outros caracteres em uma "variável", use matrizes bash.

# assign some items to start with
items=( "How much wood would a woodchuck chuck," "if a wooodchuck could chuck wood?" )

# append some items
items+=( "$zenlist"* )

zenity --list --title='A single-column List' --width=600 --height=450 \
       --column='Spaces are allowed within "q u o t e s"' "${items[@]}"
    
por geirha 20.01.2011 / 21:13
5

Você pode canalizar o conteúdo da lista para o zenity, como

(echo "How much wood would a woodchuck chuck," ; \
 echo "if a wooodchuck could chuck wood?" ; \
 ls -Q -1 "$zenlist"* |sed 's/$/ \/') \
| zenity --list --title='A single-column List' --width=600 --height=450 \
         --column='Spaces are allowed within "q u o t e s"'
    
por Florian Diesch 24.12.2010 / 12:32

Tags