• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[TIP]automatische Eingabevervollständigung in bash erweitern

oc2pus

Ultimate Guru
Seit Version 2.04 verfügt die Bourne Again Shell (bash) über die Möglichkeit, die automatische Eingabe-Vervollständigung durch eigene Definitionen zu erweitern. Ein Tool, das hiervon intensiv Gebrauch macht, ist bash-completion.

Die SuSE Nutzer können das noarch.rpm passend zu ihrer bash Version installieren
rpm -q bash ==> welche bash Version ist im Einsatz

Dieses tolle Tool ist zu finden unter:
http://www.caliban.org/bash/index.shtml#completion.
Bei Debian ist es bereits in das bash-Paket integriert, muß aber manuell aktiviert werden.

Damit die Erweiterungen aktiviert werden für jeden User ist die Datei $HOME/.bashrc zu editieren und um die folgende Zeile zu erweitern:
Code:
 # bash-completion
[ -z "$BASH_COMPLETION" ] && declare -r BASH_COMPLETION=/etc/bash_completion
Damit ist ab dem nächsten shell-Neustart die Erweiterung aktiviert.

Es gehen dann so tolle Sachen wie:
apt-get <tab><tab> und es werden alle apt-get Optionen angezeigt

weitere Infos:
http://www.pl-berichte.de/t_system/bash-completion.html

Vielleicht hat ja jemand Lust das für das apt-Wrapper Script zu erweitern ?
Dazu müsste die Datei /etc/bash_completion erweitert/editiert werden.

Und in /usr/share/doc/packages/bash-completion/contrib/ befinden sich weitere Dateien für andere gängige Programme (bittorrent, subversion, bitkeeper, ...)
 

SoeDib

Member
Kleiner Tip zu bash-completion:
Wer, wie auch in den FAQ beschrieben, das folgende kleine Skript nach z.B. /etc/cron.daily/updaterpmdb stellt, kann in Zukunft RPM-Namen erheblich schneller über <Tab> vervollständigen:
Code:
#!/bin/sh
rpm -qa --qf '%{name}-%{version}-%{release}.%{arch}.rpm\n' 2>&1 | sort > /var/log/rpmpkgs
(Ausführbar machen nicht vergessen.)

Dies funktioniert genau dann, wenn /var/log/rpmpkgs nach der letzten Änderung an der RPM-Datenbank erstellt wurde; d.h. also, dass /etc/bash_completion nach der Installation oder Entfernung eines RPMs wieder solange die langsame Methode zur Ermittlung von RPM-Namen verwendet, wie /var/log/rpmpkgs nicht neu erstellt wird.

(Teilweise) Abhilfe schaffen diese beiden Code-Schnipsel:
Als /etc/apt/apt.conf.d/updaterpmdb.conf:
Code:
Scripts::PM::Post:: "updaterpmdb.lua";
Scripts::Options::RunPostScript "true";
User::Post "/etc/cron.daily/updaterpmdb";
und als /usr/share/apt/scripts/updaterpmdb.lua:
Code:
if transaction_success == false then
	return
end

if confexists("Scripts::Options::ShowRpmCmd") and
  confget("Scripts::Options::ShowRpmCmd/b") == "true" then
	return
end

if not confexists("Scripts::Options::RunPostScript") or
  confget("Scripts::Options::RunPostScript/b") == "false" then
	return
end

if confexists("User::Post") then
	UPS = confget("User::Post")
	-- don't log when in --test mode
	configs = { "RPM::Options", "RPM::Install-Options", "RPM::Erase-Options" }
	for i, conf in ipairs(configs) do
		rpmopts = confgetlist(conf, "")
		for j, opt in ipairs(rpmopts) do
			if string.find(opt, "test") then
				print( "apt running in test mode: "..UPS.." would now be executed")
				return
			end
		end
	end
	print("apt executing: "..UPS)
	os.execute( UPS )
end

Dies veranlasst apt, nach jedem install, remove, upgrade, usw. das Skript zur Aktualisierung der RPM-Namen aufzurufen, so daß /var/log/rpmpkgs immer "neu genug" ist, auch nachdem etwas mit apt (de-)installiert wurde. Soll die schnelle RPM-Namenskomplettierung aber auch nach Gebrauch von "rpm" zur De-/Installation erhalten bleiben, muss das Cron-Skript einmal von Hand aufgerufen werden.

Grüße,
SoeDib
 
Oben