staging.inyokaproject.org

function für die .bashrc reinstall - bequem Pakete reinstallieren für Faule

Status: Ungelöst | Ubuntu-Version: Kubuntu 22.04 (Jammy Jellyfish)
Antworten |

trollsportverein

Avatar von trollsportverein

Anmeldungsdatum:
21. Oktober 2010

Beiträge: 2627

Bequemlichkeit und innovative Faulheit war vermutlich schon immer eine große Triebfeder für Innovation. ☺

Dies hier ist eine .bashrc function um möglichst bequem und schnell DEB-Pakete auch im Pulk zu reinstallieren.

function reinstall () 
{ 
    sudo apt-get install --reinstall `dpkg -l | awk /"$@"/'{print $2}'`
}

NIcht vergessen die $HOME/.bashrc wieder neu einlesen nach editieren dieser Bash Konfigurationsdatei:

source $HOME/.bashrc

Pakete raussuchen mit:

dpkg -l | grep -E 'boswars|apt-doc'

boswars ist ein Spiel wofür 2 DEB-Pakete benötigt werden und apt-doc ist die APT-Dokumentation, beides dient hier als Beispiel und als Test. Reinstallation der beiden boswars DEB-Pakete und apt-doc:

reinstall 'boswars|apt-doc'

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 7816

trollsportverein schrieb:

[…]

reinstall 'boswars|apt-doc'

Und was passiert, wenn Du Deine schone Funktion mit mehreren Argumenten aufrufst, was ja nach Definition möglich sein soll, denn sonst würdest Du das Array $@ nicht verwenden?

reinstall boswars apt-doc 

Und ist das, was passiert, auch das, was Du als Programmautor beabsichtigt hast?

trollsportverein

(Themenstarter)
Avatar von trollsportverein

Anmeldungsdatum:
21. Oktober 2010

Beiträge: 2627

kB schrieb:

trollsportverein schrieb:

[…]

reinstall 'boswars|apt-doc'

Und was passiert, wenn Du Deine schone Funktion mit mehreren Argumenten aufrufst, was ja nach Definition möglich sein soll, denn sonst würdest Du das Array $@ nicht verwenden?

reinstall boswars apt-doc 

Und ist das, was passiert, auch das, was Du als Programmautor beabsichtigt hast?

Ich habe nicht behauptet dass es narrensicher sei. Man könnte es auf $1 ändern, aber auch dann würde apt-doc nicht reinstalliert werden, wenn man es nicht zuvor so einpacken würde:

reinstall 'boswars|apt-doc'

Mit " einrahmen, anstatt ' geht es auch. Ohne einrahmen und | für mehre Ziele funktioniert diese Bash function nicht, also nicht so eingeben: reinstall boswars apt-doc .

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 7816

trollsportverein schrieb:

[…] Ich habe nicht behauptet dass es narrensicher sei.

Das ist richtig und in der Tat ist es nicht narrensicher. Die versprichst „Bequemlichkeit und innovative Faulheit“, lieferst aber eine Lösung, die mehr Arbeit macht als vorher:

Du willst – korrigiere mich, falls ich das falsch verstanden haben sollte – eine Liste von Paketen rasch erneut installieren. Deine Lösung erfordert aber nun als zusätzliche Arbeit die Umwandlung dieser Liste in ein für dpkg verständliches Suchmuster.

Vielleicht ist dies ein besseres Werkzeug für Deine Aufgabe:

reinstall () { sudo apt-get install --reinstall $( dpkg -l $@ | awk 'NR > 6 {print $2}' ) ;} 

trollsportverein

(Themenstarter)
Avatar von trollsportverein

Anmeldungsdatum:
21. Oktober 2010

Beiträge: 2627

kB schrieb:

Vielleicht ist dies ein besseres Werkzeug für Deine Aufgabe:

reinstall () { sudo apt-get install --reinstall $( dpkg -l $@ | awk 'NR > 6 {print $2}' ) ;} 

Leider funktioniert das so nicht. Es erwischt das installierte Paket boswars-data nicht. Meine function macht das.

Zum HIntergrund: vor einigen Tagen hat es mir den guten Klang meines Billig-Bluetooth-Kopfhörers vom Lebensmitteldiscounter kaputt gemacht. Es stellte sich nach viel herumfummeln und /etc/pulse/default.pa editieren und ausprobieren mit pusaudio killen und neustarten, so wie Bluetooth wiederverbinden heraus, dass es an den Paketen libasound2-plugin-bluez und bluez-alsa-utils lag, die den Klang des Billig-Bluetooth-Kopfhörers ruinierten. Merkwürdigerweise hat aber am darauf folgenden Tag noch einmal der schlechte Mono-Klang auf 8000Hz begrenzt den Klang ungenießbar gemacht. Verdächtige Pakete einfach noch mal reinstallieren hat das behoben. Bloß wollte ich mir nicht wieder libasound2-plugin-bluez und bluez-alsa-utils eintreten. Also einfach \*bluez\* dem sudo apt-get install --reinstall übergeben wäre nicht die Lösung, sondern das Problem mit dem Problem frisch ersetzen. 😉 Die vollständige Liste der Pakete, die ich dann mal neu reinstallierte, lässt sich hier *klick* einsehen. Meine function ist darauf gegründet, dass ich es so, wie ich es raus suche auch an die reinstall () function übergeben kann. Müsste ich das ändern, um etwa die Eingabe ohne Anführungsstriche und Pipe zu machen, wäre das Mehraufwand, was nicht in meinem Sinne wäre.

itoss

Avatar von itoss

Anmeldungsdatum:
4. April 2014

Beiträge: Zähle...

Die Idee wiederkehrende Eingaben zu automatisieren macht Sinn - ABER :

1. Ich würde nur Bashconfigs auch in die Bashconfig schreiben ( Prompt configs etc in die .bashrc )

2. Ich würde für o.g. Mechanismen Skripte in /usr/local/bin ablegen

3. Skripte sollen vereinfachen. Die Eingabe Syntax "string|string1"> ist kontraproduktiv weil zu umständlich

4. Detaillierte Fehlerausgaben um Eingabefehler zu vermeiden aufzuzeigen

Was dabei rauskommt sieht dann ungefähr so aus :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/bin/bash

# create DPKG list
DPKGList=$(dpkg -l  | awk 'NR > 6 {print $2}')
PackageInputList="$@"

# exit when missing input 
if [[ -z $1 ]]; then 
  printf "enter a package name\n"
  exit	
fi

# check for root permission
if [ "$(whoami)" = "root" ]; then echo "";else echo "Are You Root ?";exit 1;fi

# processing package input
printf "processing packets : $PackageInputList \n"
for Packet in "$@" ; do
  # installed packages
  if   [[ -n $( grep -w $Packet 2>/dev/null <<< $DPKGList) ]]; then
	PacketsListAvailable=$(echo "$PacketsListAvailable $Packet" )
  # missing packages
  else
	PacketsListMising=$(echo "$PacketsListMising $Packet" )	
  fi
done

# print packagelists
if [[ -n $PacketsListMising ]]; then printf "\npacket(s) not found: $PacketsListMising \n" ; fi
if [[ -n $PacketsListAvailable ]]; then	printf "\npacket(s) found: $PacketsListAvailable \n" ; fi
printf "\n"

# proccess packagelists
request_loop () {
read  -n1 -p "Do you want to remove (d), reinstall (r) or cancel (c) proccessing packages ($PacketsListAvailable )? " response
case $response in
	[Rr]* ) sudo apt install --reinstall $PacketsListAvailable;;
	[Dd]* ) sudo apt remove --purge $PacketsListAvailable;;
	[Cc]* ) printf "\n" && exit 1;;
	* )	printf "\n please enter : <d|r|c>\n"
		request_loop;;
esac
}
request_loop

exit 0
Antworten |