Divisão de palavras quando o parâmetro é usado na substituição de comandos

6

O que precisa ser feito para garantir que um parâmetro contendo espaços incorporados seja tratado corretamente quando usado em uma substituição de comando? Talvez um exemplo ilustre

$ file="/home/1_cr/xy z"
$ basename $file
xy

$ #need to pass basename a quoted $file to prevent the z in 'xy z' from being eaten
$ basename "$file"
xy z

$ #Now using $file inside a command substitution without quoting.....
$ #....the command substitution causes 'xy z' to split
$ set -- $(basename "$file")
$ printf "%s\n" "$@"
xy
z

$ #But quoting the command substitution does not prevent 'xy z'...... 
$ #....from being split before being passed to basename
$ set -- "$(basename $file)"
$ printf "%s\n" "$@"
xy

O que eu preciso fazer para que

$ set -- $(basename $file)
$ printf "%s\n" "$@"

rendimentos

xy z   
    
por iruvar 12.11.2013 / 23:32

2 respostas

5

Você precisa colocar aspas duplas em torno de todas as substituições de comando e variável.

set -- "$(basename -- "$file")"

Se você permitir que o valor da variável seja dividido em palavras e essas palavras sejam tratadas como padrões globais, não haverá retorno. Você não pode mais informar quantos espaços estavam lá ou se os nomes de arquivos eram o resultado de uma expansão de caractere curinga. Você não pode transformar o hambúrguer de volta em uma vaca, então você deve se certificar de não enviar a vaca para o matadouro em primeiro lugar.

    
por 13.11.2013 / 00:50
3

Você tem várias opções,

  1. Use "$ " * em vez "$ @"

     set -- $(basename "$file")
     printf "%s\n" "$*"
    
  2. Cite a substituição do comando e a variável

     set -- "$(basename "$file")"
     printf "%s\n" "$@"
    
por 12.11.2013 / 23:53