Necesita ayuda para combinar 3 líneas divididas de script bash en una sola línea

Lo siguiente es lo que encontré después de googlear:

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 

¿Podría alguien combinar las 3 líneas anteriores en una sola? Me resulta más fácil copyr y pegar una sola línea en un command sudo que tres líneas, una a la vez.

Gracias de antemano por tu ayuda.

Para Hauke ​​Laging : he editado esta publicación original para include el post de error cuando intenté copyr las tres líneas divididas a la vez siguiendo el command sudo:

 username@hostname:~$ sudo -i [sudo] password for username: root@hostname:~# dpkg --list 'linux-image-*' \ > Desinetworking=Unknown/Install/Remove/Purge/Hold | Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend |/ Err?=(none)/Reinst-requinetworking (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 

Solutions Collecting From Web of "Necesita ayuda para combinar 3 líneas divididas de script bash en una sola línea"

También puedes crear una function (ver a continuación).

Puede ponerlo en un file, por ejemplo, ~/MyPersonalFunctions , en el que agregará con time todas las funciones que necesitará usar.

Puede cargarlo solo cuando lo necesite con el command source ~/MyPersonalFunctions y tendrá su set ampliado de funciones.
Incluso puede cargarlo cada vez escribiendo automáticamente la source ~/MyPersonalFunctions en el file ~/.bashrc .

Nota: debe escribir la ruta completa donde coloca este file. Por ejemplo, si lo coloca en su directory ~/bin , escribirá 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... :-) } 

Por supuesto, puede usarlo con la versión más corta del código propuesto por la otra respuesta en esta página.

No hay necesidad de hacer una línea de esos tres. El shell elimina la nueva línea si es escapada por \ . En otras palabras: un command con arguments sobre tres líneas de ese tipo "ve" solo una línea, no tres.

El siguiente problema es:

 sudo cmd1 | cmd2 | cmd3 

hace que solo cmd1 ejecute como root. Podrías hacer algo como

 sudo bash -c 'cmd1 | cmd2 | cmd3' 

pero eso puede causar la cita de molestias.

La solución más fácil es: crear un file vacío, copyr las tres líneas en él y luego ejecutarlo con:

 sudo bash file 

uso | para saltos de línea seguros

Puedes poner el | al final de una linea De esa manera no puede haber problemas con nuevas líneas (adicionales). Prueba esto:

 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 

Backslash-newline es una forma de dividir líneas en un lugar donde la syntax normalmente no permitiría un salto de línea, por lo que podría eliminarlo.

 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 

Si desea ejecutar esto debajo de sudo, no puede simplemente copyr y pegar esa línea después de sudo , porque solo el command dpkg se ejecutaría como root. De hecho, solo aptitude necesita ejecutarse 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 command es demasiado complejo para lo que hace. El script perl filtra algunos packages instalados, pero aptitude es perfectamente capaz de hacer ese filtrado.

 sudo aptitude purge -y "~i ^linux-image !?exact-name(linux-image-$(uname -r))"