Combinando 3 linhas de divisão do script bash em uma única linha

2

Segui o que encontrei depois de pesquisar:

dpkg --list 'linux-image-*' \
    | perl -ane 'BEGIN { $r = 'uname -r' or die; chomp $r } print $F[1], "\n" if $F[0] eq "ii" && $F[1] !~ /\Q$r\E\b/' \
    | xargs -r aptitude purge -y

Alguém poderia combinar as três linhas acima em uma? Acho mais fácil copiar e colar uma única linha em um comando sudo do que três linhas, uma de cada vez.

Para Hauke Laging : Eu editei esta postagem original para incluir a mensagem de erro quando tentei copiar as três linhas de divisão de uma só vez seguindo o comando sudo:

username@hostname:~$ sudo -i
[sudo] password for username: 
root@hostname:~# dpkg --list 'linux-image-*' \
> 
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name           Version      Architecture Description
+++-==============-============-============-=================================
un  linux-image-2. <none>                    (no description available)
un  linux-image-2. <none>                    (no description available)
un  linux-image-2. <none>                    (no description available)
un  linux-image-2. <none>                    (no description available)
ii  linux-image-3. 3.14.4-1~bpo amd64        Linux 3.14 for 64-bit PCs
ii  linux-image-3. 3.2.57-3+deb amd64        Linux 3.2 for 64-bit PCs
ii  linux-image-am 3.14+57~bpo7 amd64        Linux for 64-bit PCs (meta-packag
root@hostname:~#     | perl -ane 'BEGIN { $r = 'uname -r' or die; chomp $r } print $F[1], "\n" if $F[0] eq "ii" && $F[1] !~ /\Q$r\E\b/' \
-bash: syntax error near unexpected token '|'
root@hostname:~# 
root@hostname:~#     | xargs -r aptitude purge -y
    
por user66229 29.05.2014 / 17:10

3 respostas

1

Você também pode criar uma função (veja abaixo).

Você pode colocá-lo em um arquivo, por exemplo ~/MyPersonalFunctions , em que você adicionará com o tempo todas as funções que precisará usar.

Você pode carregá-lo somente quando precisar com o comando source ~/MyPersonalFunctions e terá seu conjunto estendido de funções.
  Você pode até carregá-lo sempre gravando automaticamente source ~/MyPersonalFunctions no arquivo ~/.bashrc .

Nota: você tem que escrever o caminho completo onde você colocou este arquivo. Por exemplo, se você colocar no diretório ~/bin , você escreverá source ~/bin/MyPersonalFunctions ).

function PurgeKernels()
{
dpkg --list 'linux-image-*' \
    | perl -ane 'BEGIN { $r = 'uname -r' or die; chomp $r } print $F[1], "\n" if $F[0] eq "ii" && $F[1] !~ /\Q$r\E\b/' \
    | xargs -r sudo aptitude purge -y
}

function Cat(){  # Just to show you can put in the same file 
  echo Meow      # more than one function... :-)
}

É claro que você pode usá-lo com a versão mais curta do código proposto pela outra resposta nesta página.

    
por 30.05.2014 / 08:45
6

Não há necessidade de fazer uma linha entre esses três. O shell remove a nova linha se for escapado por \ . Em outras palavras: Um comando com argumentos sobre três linhas desse tipo "vê" apenas uma linha, não três.

O próximo problema é:

sudo cmd1 | cmd2 | cmd3

faz com que apenas cmd1 seja executado como root. Você poderia fazer algo como

sudo bash -c 'cmd1 | cmd2 | cmd3'

mas isso pode causar incômodos entre aspas.

A solução provavelmente mais fácil é: Crie um arquivo vazio, copie as três linhas para ele e, em seguida, execute-o com:

sudo bash file

use | para quebras de linha seguras

Você pode colocar o | no final de uma linha. Dessa forma, não pode haver problemas com novas linhas (adicionais). Tente isto:

dpkg --list 'linux-image-*' |
  perl -ane 'BEGIN { $r = 'uname -r' or die; chomp $r } print $F[1], "\n" if $F[0] eq "ii" && $F[1] !~ /\Q$r\E\b/' |
  sudo xargs -r aptitude purge -y
    
por 29.05.2014 / 17:24
5

A barra invertida-nova linha é uma maneira de dividir as linhas em um local em que a sintaxe normalmente não permitiria uma quebra de linha, portanto, você poderia simplesmente removê-la.

dpkg --list 'linux-image-*' | perl -ane 'BEGIN { $r = 'uname -r' or die; chomp $r } print $F[1], "\n" if $F[0] eq "ii" && $F[1] !~ /\Q$r\E\b/' | xargs -r aptitude purge -y

Se você quer rodar isto sob o sudo, você não pode simplesmente copiar e colar essa linha depois de sudo , porque somente o comando dpkg seria então executado como root. Na verdade, apenas aptitude precisa ser executado como root.

dpkg --list 'linux-image-*' | perl -ane 'BEGIN { $r = 'uname -r' or die; chomp $r } print $F[1], "\n" if $F[0] eq "ii" && $F[1] !~ /\Q$r\E\b/' | xargs -r sudo aptitude purge -y

Este comando é excessivamente complexo para o que faz. O script perl filtra alguns pacotes instalados, mas o aptitude é perfeitamente capaz de fazer essa filtragem.

sudo aptitude purge -y "~i ^linux-image !?exact-name(linux-image-$(uname -r))"
    
por 30.05.2014 / 03:06