bashスクリプトの3行を1行にまとめる

bashスクリプトの3行を1行にまとめる

Google で検索した内容は次のとおりです。

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

誰かが上記の3行を1つにまとめることができますか?私は一度に3行をコピーするよりも1行をコピーしてsudoコマンドに貼り付ける方が簡単です。

Hauke 遅延の場合: sudo コマンドに従って一度に 3 つの区切り線をコピーしようとしたときに、エラー メッセージを含めるようにこのソース ポストを編集しました。

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

これらの3行のいずれかを選択する必要はありません。改行文字がエスケープされると、シェルはそれを削除します\。つまり、3行の引数を持つコマンドは、3行ではなく1行だけ「表示」できます。

次の質問は次のとおりです。

sudo cmd1 | cmd2 | cmd3

ルートとしてのみ実行されますcmd1。次のようなことができます

sudo bash -c 'cmd1 | cmd2 | cmd3'

しかし、これは引用の迷惑を引き起こす可能性があります。

最も簡単な解決策は、おそらく空のファイルを作成し、ここに3行をコピーして実行することです。

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コマンドのみがdpkgrootとして実行できるため、その行をコピーして貼り付けることはできません。実際にaptituderootとして実行するだけです。

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... :-)
}

もちろん、このページの他の回答で提案されているより短いバージョンのコードで使用できます。

関連情報