Como posso passar o argumento armazenado em uma variável para o WGET?

9

Estou escrevendo um script bash que usa extensivamente o wget. Para definir todos os parâmetros comuns em um local, armazeno-os em variáveis. Aqui está um trecho de código:

useragent='--user-agent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0"'
cookies_file="/tmp/wget-cookies.txt"
save_cookies_cmd="--save-cookies $cookies_file --keep-session-cookies"
load_cookies_cmd="--load-cookies $cookies_file --keep-session-cookies"

function mywget {
    log "#!!!!!!!!!# WGET #!!!!!!!!!# wget $quiet $useragent $load_cookies_cmd $@"  
    wget $useragent $load_cookies_cmd "$@"
}

Infelizmente não está funcionando. De alguma forma, estou perdendo o caminho certo para armazenar parâmetros nas variáveis $ useragent, $ save_cookies_cmd, $ load_cookies_cmd e calling wget passando esses vars como parâmetros.

Eu quero a linha de comando resultado como esta:

wget --user-agent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0" --load-cookies /tmp/wget-cookies.txt --keep-session-cookies http://mysite.local/myfile.php

EDITAR: Minha solução final:

No final, meu script está funcionando corretamente com isso:

useragent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0"
useragent_cmd="--user-agent=$useragent"
cookies_file="/tmp/wget-cookies.txt"
save_cookies_cmd="--save-cookies $cookies_file --keep-session-cookies"
load_cookies_cmd="--load-cookies $cookies_file --keep-session-cookies"

function mywget {
    log "#!!!!!!!!!# WGET #!!!!!!!!!# wget $load_cookies_cmd $useragent_cmd $@"  
    wget $load_cookies_cmd "$useragent_cmd" "$@"
}

Obrigado por todas as suas respostas.

    
por Filipe 19.03.2014 / 21:36

3 respostas

3

link

user_agent='--user-agent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0"'
cookies_file="/tmp/wget-cookies.txt"
save_cookies_opts=( --save-cookies "$cookies_file" --keep-session-cookies )
load_cookies_opts=( --load-cookies "$cookies_file" --keep-session-cookies )

function mywget {
    log "#!!!!!!!!!# WGET #!!!!!!!!!# wget $quiet $useragent $load_cookies_cmd $@"
    wget "$user_agent" "${load_cookies_opts[@]}" "$@"
}

Observe que na chamada do wget, "$user_agent" é citado. Isso é crucial.

    
por 19.03.2014 / 21:56
3

O problema está na ordem das expansões (veja EXPANSÃO em man bash para detalhes). Aspas duplas dentro de uma variável não funcionam como aspas duplas quando a variável é expandida:

$ a='1 "2 3" 4' ; for b in $a ; do echo $b ; done
1
"2
3"
4

Note que o uso de "$ b" não ajuda você.

Use matrizes, para que possa deixar o bash fazer o trabalho duro e você pode esquecer-se sobre citações e escapes:

$ a=(1 '2 3' 4) ; for b in "${a[@]}" ; do echo $b ; done
1
2 3
4
    
por 19.03.2014 / 21:51
3
    mywget() ( echo log "wget $quiet \
                         userstring=${userstring:-unset} \
                         cookies=${cookies:-no} $@"
            echo wget ${userstring:+--useragent="$userstring"} \
                    ${cookies:+--${cookies}-cookies \
                    "$cookies_file" --keep-session-cookies} "$@"
    ) <<-PARAMS
            ${DQ=$(printf \042)}
            ${NL=
}
            ${userstring="${DQ}Mozilla/5.0 \
                (Windows NT 6.1; WOW64; rv:27.0) \
                Gecko/20100101 Firefox/27.0${DQ}"}
            ${cookies_file="/tmp/wget-cookies.txt"}
            ${cookies=save}
    PARAMS

Por favor, me perdoe, mas tomei a liberdade de parameterizing da sua função. Como os valores em PARAMS definem uma variável não definida, você pode substituir seus valores com muita facilidade - ele permite definir padrões saudáveis e ainda assim alterar valores por função ligue como quiser. Por exemplo, na função acima, eu configurei todos os valores para echo e aqui está a saída quando executada como está:

log wget  userstring="Mozilla/5.0 \
    (Windows NT 6.1; WOW64; rv:27.0) \
    Gecko/20100101 Firefox/27.0" \
    cookies=save
wget --useragent="Mozilla/5.0 \
    (Windows NT 6.1; WOW64; rv:27.0) \
    Gecko/20100101 Firefox/27.0" \
    --save-cookies /tmp/wget-cookies.txt \
    --keep-session-cookies

Mas se eu definir "$userstring" para NULL :

    userstring= mywget
log wget  userstring=unset cookies=save
wget --save-cookies /tmp/wget-cookies.txt --keep-session-cookies

Ou:

    cookies=load cookies_file=/some/other/cookie.file mywget
log wget  userstring="Mozilla/5.0 \
    (Windows NT 6.1; WOW64; rv:27.0) \
    Gecko/20100101 Firefox/27.0" \
    cookies=load
wget --useragent="Mozilla/5.0 \
    (Windows NT 6.1; WOW64; rv:27.0) \
    Gecko/20100101 Firefox/27.0" \
    --load-cookies /some/other/cookie.file \
    --keep-session-cookies

Ou:

    cookies= userstring= mywget
log wget  userstring=unset cookies=no
wget

Escrevi mais sobre parameter expansion aqui e aqui .

    
por 19.03.2014 / 23:08