Espere perucas quando uso as aspas simples em [exec ls -h | grep '\ .foo']

2

Estou tentando armazenar uma lista de arquivos específicos em uma variável esperada.

No meu script, estou tentando compilar arquivos com extensões de arquivo diferentes, como .foo, .bar.

Neste exemplo, tenho os seguintes arquivos:

  • something.foo
  • something_new.foo
  • something_different.bar
  • this_is_the_wrong_one.sh

Para obter apenas arquivos .foo, tentei executar isso:

set files "[exec ls -h | grep -E '\.foo' | rev | cut -c5- | rev]"
send_user "$files\n"

Eu esperava ver:

  • algo
  • something_new

No entanto, acabei recebendo esta mensagem de erro:

child process exited abnormally
    while executing
"exec ls -h | grep -E '\.foo' | rev | cut -c5- | rev"
    invoked from within
"set files "[exec ls -h | grep -E '\.foo' | rev | cut -c5- | rev]""
    (file "./runthis.sh" line 2)

Eu sei que eu poderia usar find '*.foo' , ls -h *.foo , awk , etc. Eu notei o padrão ... com find , espere perucas se eu usar o ' (aspas simples), então Isso praticamente elimina a idéia de usar find , awk e grep . Se eu usar ls -h *.foo e os arquivos não existirem, o script será interrompido. É suposto continuar verificando e listando outros arquivos.

Se encontrar os arquivos, eles serão eventualmente divididos em um array usando este comando:

Atualização 1:

set split_files "[split $files \n]"
    
por Sometowngeek 05.09.2018 / 13:37

1 resposta

4

O problema é que as aspas simples não são especiais para tcl , portanto, você está realmente executando o comando grep com o argumento '\.foo' , incluindo as aspas que normalmente seriam removidas pelo shell.

Isso faz com que o grep não corresponda, portanto, ele sai com um código de erro diferente de zero e, portanto, o comando exec transmite o erro.

A resposta imediata é usar tcl aspas duplas ( grep -E "\.foo" ) ou não aspas ( grep -E \.foo ) ou aspas ( grep -E {\.foo} ). Mas uma alternativa é não recorrer a comandos de shell. O equivalente em tcl pode ser:

set fullfiles [glob *.foo]
foreach f $fullfiles { lappend files [string trimright $f .foo] }
    
por 05.09.2018 / 15:29

Tags