Ajuda do script Bash [fechado]

2

O --print-uris no apt irá imprimir toda a saída junto com os URLs para um arquivo txt especificado. Eu preciso de um comando que só irá selecionar os pacotes a serem instalados a partir da saída de uris de impressão e redirecioná-los para um arquivo. Como você deve ter imaginado que eu estou tentando criar um script. Agradecemos antecipadamente

    
por Sayan 27.05.2014 / 18:33

1 resposta

0

Mowiewowie, outra prova da capacidade de supercopa apt !! Talvez esse arquivo, chamado supercow , ajude:

#!/bin/bash

# exactly one argument
[[ $# -ne 1 ]] && echo "Usage: $( basename $0 ) PACKAGE" && exit 1

PACKAGE_DIRECTORY=$( mktemp -d )    # Target directory
PACKAGE_LOGFILE=$( mktemp )         # Target file
cd $PACKAGE_DIRECTORY || exit 1     # Exit if directory does not exist
apt_out_all=$(( apt-get --print-uris --yes install $1 ) 2>&1 )

apt_out_check=$( echo $apt_out_all | sed s/^.*information...\ // )

# error checks
if ! [[ $( echo $apt_out_check | grep "packages will be installed" ) ]]
then
    echo -n "ERROR: "

    if   [[ "${apt_out_check%% *}" == "E:" ]]
        then echo "Unable to locate package $1."

    elif [[ "${apt_out_check%% *}" == "$1" ]]
        then echo "$1 already installed." # look at /var/cache/apt/archives

    # other, eg: Package solid is not available, but is referred to ...
    else echo "${apt_out_check}"
    fi
    exit 1
fi

# loop through all lines: tee to file if package, wget uri if not empty
for i in $apt_out_all ; do
    uri=$(  echo $i | tee >(grep ".deb$" >> $PACKAGE_LOGFILE) \
                    | grep "^'http" | sed -e s/^\'// -e s/\'$// )
    [[ $uri ]] && if ! wget $uri ; then
                echo "ERROR: wget failed" ; exit 1 ; fi
done

echo "Here is the content of the logfile:" ; cat $PACKAGE_LOGFILE
echo -e "\nHere is the content of the directory:" ; ls $PACKAGE_DIRECTORY

Minha primeira tentativa foi uma grande falha porque não havia nem uma verificação de entrada de usuário maluca nem se o pacote já estava instalado. Além disso, parecia que se, por exemplo. gcc já está instalado descarta uma string de erro e, por exemplo, geany apenas uma linha vazia. Então eu ainda usaria com saudável suspeita, embora esta tentativa pareça muito mais sólida. Eu também apaguei cheques duplos, etc.

Exemplo: $ bash supercow kobodeluxe

#... wget messages

Here is the content of the logfile:
kobodeluxe-data_0.5.1-6_all.deb
kobodeluxe_0.5.1-6_amd64.deb

Here is the content of the directory:
kobodeluxe_0.5.1-6_amd64.deb  kobodeluxe-data_0.5.1-6_all.deb

Exemplo: $ bash supercow bash

bash already installed.

Exemplo: $ bash supercow windows3.11

Unable to locate package windows3.11.

Exemplo: $bash supercow solid

ERROR: Package solid is not available, but is referred to by another package.
#...

Espero que isso ajude!

EDITAR PARA A PERGUNTA: Em seguida, substitua grep ".deb$" >> $PACKAGE_LOGFILE entre parênteses por grep ".deb$" | sed s/_.*// >> $PACKAGE_LOGFILE porque não conheço um pacote oficial que contenha um sublinhado, a menos que eu esteja enganado.

    
por elf12 27.05.2014 / 23:43