将 3 行 bash 脚本合并为一行

将 3 行 bash 脚本合并为一行

以下是我谷歌搜索后发现的:

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

有人可以将上述三行合并为一行吗?我发现将一行复制并粘贴到 sudo 命令中比每次一行复制三行更容易。

对于豪克包胶:我编辑了这篇原始文章,以包含当我尝试按照 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

答案1

没有必要从这三行中选出一行。如果换行符被 转义,shell 会删除它\。换句话说:带有三行此类参数的命令只能“看到”一行,而不是三行。

下一个问题是:

sudo cmd1 | cmd2 | cmd3

导致仅以cmd1root 身份运行。你可以做类似的事情

sudo bash -c 'cmd1 | cmd2 | cmd3'

但这可能会引起引用烦恼。

最简单的解决方案可能是:创建一个空文件,将三行复制到其中,然后运行它:

sudo bash file

用于|安全换行

您可以将 放在|行尾。这样,(额外的)换行符就不会出现问题。尝试这个:

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

答案2

反斜杠换行符是一种在语法通常不允许换行的地方分割行的方法,因此您可以将其删除。

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

如果你想在 sudo 下运行它,你不能只是复制粘贴该行sudo,因为只有该dpkg命令才能以 root 身份运行。其实只aptitude需要以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

该命令的功能过于复杂。 perl 脚本会过滤一些已安装的软件包,但 aptitude 完全有能力执行该过滤。

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

答案3

您也可以创建一个函数(见下文)。

您可以将其放入一个文件中,例如~/MyPersonalFunctions,您将在其中添加您需要使用的所有功能。

您可以仅在需要时使用命令加载它source ~/MyPersonalFunctions,并且您将拥有扩展的功能集。
您甚至可以在每次自动写入source ~/MyPersonalFunctions文件时加载它~/.bashrc

注意:您必须写入放置此文件的完整路径。例如,如果您将其放入~/bin目录中,您将编写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... :-)
}

当然,您可以将其与本页其他答案提出的代码的较短版本一起使用。

相关内容