Como retornar uma string de uma função bash que contém um nome de arquivo com espaços?

1

Estou tentando escrever uma função que retorna uma string que consiste em duas partes:

  1. opção
  2. nome do arquivo com espaços.

Meu problema é: como citar para passar o resultado para outro programa?

#!/bin/bash
getOption() {
  echo "-C $1"
}
# prints first lines of man page of cp (copy) 
man $(getOption "$1") cp | head -10

Neste exemplo, estou tentando passar um arquivo de configuração personalizado para man . Supondo que o snippet acima tenha o nome run.sh , a configuração personalizada é denominada my man.conf e ambas residem no mesmo diretório em que estou recebendo este erro:

$ ./run.sh "my man.conf"
my: No such file or directory
Warning: cannot open configuration file my
# output from man for man…

Como glenn jackman indicou: eu estava perdendo um ponto dos documentos do Bash

The root of the issue described above is that you need a way to maintain each argument as a separate word, even if that argument contains spaces. Quotes won't do it, but an array will.

Portanto, os espaços são preservados ao atualizar para

#!/bin/bash

args=("")
addOption() {
  args+=(-C "$1")
  return 0
}

$(addOption "$1")
man "${args[@]}" cp | head -10
    
por Stephan 15.07.2013 / 18:08

2 respostas

1

veja BashFAQ / 050

Basicamente, você precisa reestruturar. Mesmo passando cotações de volta da função não vai funcionar. Este

getOption() {
  echo "-C '$1'"
}

apenas levará à mensagem de erro cannot open configuration file 'my

Depois de concatenar uma string contendo espaço em branco em outra string, não é possível extrair a string adicionada como uma entidade única.

Dada a sua pergunta, você deve simplesmente fazer

man -C "$1" ...

Mas eu suspeito que você quer que "run.sh" seja mais complexo do que o que você mostrou. Por favor, forneça mais detalhes.

    
por 15.07.2013 / 18:44
1

Você não cita, você precisa escapar de espaços na linha de comando, por exemplo:

./run.sh my\ man.conf

Na maioria dos shells, a conclusão da tabulação ajudaria a fazer isso por você.

É claro que espaços em nomes de arquivos e diretórios são semi-maus, e a verdadeira correção é tentar evitá-los.

p.s. Eu acho que seu script tem outros problemas além de apenas obter os argumentos certos. . .

    
por 15.07.2013 / 18:15

Tags