"Fossies" - the Fresh Open Source Software Archive

Member "lesspipe-1.89/german.txt" (25 Aug 2021, 11913 Bytes) of package /linux/misc/lesspipe-1.89.tar.gz:


As a special service "Fossies" has tried to format the requested text file into HTML format (style: standard) with prefixed line numbers. Alternatively you can here view or download the uninterpreted source code file.

    1 Artikel in Linux-Magazin 1/2001 Seiten 172-174
    2 ==============================================
    3 (nur die englische Übersetzung english.txt wird von mir aktualisiert) 
    4 
    5 Mehr betrachten mit less
    6 
    7 Wer kennt nicht das Problem: Soeben wurde ein File aus dem Internet
    8 heruntergeladen, das ein vielversprechendes Programm enthalten soll. Doch
    9 bevor man an das Auspacken und Installieren geht, möchte man vielleicht
   10 erst einmal das README lesen oder eine zugehörige Manpage betrachten. Doch
   11 wie war das gleich mit dem Extrahieren von Files? Das tar Kommando hat man
   12 ja meist im Griff, zip Dateien klappen auch noch mit Nachdenken. Doch wie
   13 in aller Welt bekomme ich ein einzelnes File aus einer RPM-Datei? Richtig,
   14 da gab es ja noch den Midnight Commander und ähnliche Programme, zumindest
   15 wenn man unter Linux arbeitet. Doch was macht man auf anderen UNIX-Plattformen?
   16 In der Regel ist dort nichts Vergleichbares installiert. Und wie betrachtet
   17 man eine Manpage, die nicht in MANPATH enthalten ist? Für all diese Fragen
   18 gibt es natürlich Lösungen, aber in vielen Fällen sind UNIX-Benutzer bei
   19 solchen Problemen überfordert. Unter UNIX fällt einem als Filebetrachter
   20 sofort less [1], die bessere Alternative zu more, ein. Und da less in Gestalt
   21 der Umgebungsvariablen LESSOPEN durch externe Filter erweitert werden kann,
   22 ist less als extrem flexibler Browser konfigurierbar. Einige
   23 Linux-Distributionen legen bereits ein Skript lesspipe.sh bei, das zur
   24 Leistungssteigerung von less beiträgt. 
   25 
   26 In diesem Artikel soll ein Inputfilter für less vorgestellt werden, der
   27 eine Vielzahl gängiger Fileformate beherrscht und relativ leicht
   28 erweiterbar ist. Als Skriptsprache wurde eine Korn-shell kompatible
   29 Sprache (ksh, bash, zsh) gewählt, da das Vorhandensein der Shell
   30 immer gewährleistet ist und in den meisten Fällen vergleichsweise wenige
   31 Systemressourcen in Anspruch genommen werden. Ansonsten wäre die
   32 Realisierung des gleichen Konzeptes etwa in perl an vielen Stellen
   33 einfacher. 
   34 
   35 Dem vorzustellenden Skript lesspipe.sh liegen zwei Ideen zugrunde. Die
   36 Erkennung des Fileformats erfolgt nicht über die Fileendung, diese
   37 Methode aus der DOS-Welt ist fehleranfällig und hat einen hohen
   38 Pflegeaufwand. Für die Fileformaterkennung unter UNIX ist der Befehl file
   39 gut geeignet, aktualisierte Formatbeschreibungen sind zudem jederzeit in
   40 der aktuellen file Version zu finden [2]. Die zweite Idee besteht darin, dem
   41 lesspipe eine Hierarchie von Filenamen übergeben zu können, um auch
   42 einzelne Files aus Archiven zu betrachten. Da lesspipe.sh aber nur ein
   43 Argument übergeben werden kann, wird die hierarchische Liste von Filenamen
   44 durch ein spezielles Trennzeichen verbunden. Als Zeichen wurde der Doppelpunkt
   45 gewählt, welcher selten genug in Filenamen vorkommt.  Auf jeder Stufe des
   46 File-Extrahierens wird der Filetyp bestimmt. Damit wird garantiert, daß auch
   47 auf dem untersten Niveau noch eine zum Filetyp passende Anzeige erfolgt. 
   48 
   49 Das Betrachten einer man-Page in einem tar Archiv, welches seinerseits in
   50 einem RPM Paket steckt, könnte in folgenden Schritten erfolgen:
   51 
   52 less file-3.27-43.i386.spm
   53 
   54 gibt folgenden Output:
   55 ...
   56 SuSE series: a
   57 -rw-r--r--   1 root     root        12953 Feb  3 11:45 file-3.27.dif
   58 -rw-r--r--   1 root     root       123541 Jul  6  1999 file-3.27.tar.gz
   59 -rw-r--r--   1 root     root         3398 Mar 25 07:31 file.spec
   60 
   61 less file-3.27-43.i386.spm:file-3.27.tar.gz
   62 
   63 liefert u.a.:
   64 ...
   65 -rw-rw-r-- christos/christos  8740 1999-02-14 18:16 file-3.27/file.c
   66 -rw-rw-r-- christos/christos  4886 1999-02-14 18:16 file-3.27/file.h
   67 -rw-rw-r-- christos/christos 13428 1999-02-14 18:16 file-3.27/file.man
   68 ...
   69 
   70 less file-3.27-43.i386.spm:file-3.27.tar.gz:file-3.27/file.man
   71 
   72 liefert dann das gewünschte Resultat, die Anzeige von file.man als Manpage.
   73 Will man stattdessen die nroff Quelle sehen, hängt man einen Doppelpunkt an.
   74 
   75 less file-3.27-43.i386.spm:file-3.27.tar.gz:file-3.27/file.man:
   76 
   77 Auch das Extrahieren einzelner Files aus dem Archiv ist möglich, etwa mit
   78 
   79 less file-3.27-43.i386.spm:file-3.27.tar.gz:file-3.27/file.c > file.c
   80 
   81 Wollte man stattdessen file.man in ein File umlenken, macht es sicher mehr
   82 Sinn, die nroff Quelle als den formatierten Output abzuspeichern. Auch in
   83 diesem Fall sollte also ein Doppelpunkt angehängt werden.
   84 
   85 Wenn man mit dem tar File file-3.27.tar.gz gleichermaßen verfährt, erhält man
   86 ein unkomprimiertes tar File, da eine eventuell mögliche Dekompression immer
   87 erfolgt. Die Dekomprimierung ist im Normalfall auch wünschenswert. Wenn man 
   88 aber zum Beispiel das im RPM enthaltene File file-3.27.tar.gz extrahieren
   89 will, stört die Dekompression. Durch Anfügen eines weiteren Doppelpunktes
   90 bleibt auch die komprimierte Datei intakt, indem man z.B. schreibt:
   91 
   92 less file-3.27-43.i386.spm:file-3.27.tar.gz:: > file-3.27.tar.gz
   93 
   94 Das (etwas vereinfachte) Skript lesspipe.sh ist in Listing 1 abgedruckt,
   95 eine aktuelle und komplette Version, die bis zur Rekursionstiefe 6 geht
   96 und weitere Filetypen berücksichtigt, ist unter [3] zu finden. 
   97 
   98 In einigen wenigen Fällen erkennt der File-Befehl den falschen Typ
   99 (insbesondere nroff-Format), dann kann man eine ungefilterte Ansicht durch
  100 nachgestellten Doppelpunkt bei der Fileangabe erzwingen. Dann erfolgt die
  101 Ausgabe des Files mit dem Befehl cat.
  102 
  103 Eine Erweiterung des Skripts um zusätzliche Fileformate ist relativ leicht
  104 möglich, Im einfachsten Fall hat man für neue Formate in die Funktion isfinal
  105 nach dem Muster aus Zeilen 125-127 Befehle einzufügen, die auf STDOUT
  106 schreiben. Handelt es sich um ein neues Kompressionsformat, wird man in der
  107 Funktion get_cmd neue Befehle analog zu den Zeilen 64-65 einfügen müssen.
  108 
  109 Etwas aufwendiger wird es mit einem neuen Archivformat. Das Anzeigen des
  110 Archivinhaltes geschieht in der Funktion isfinal (siehe z.B. Zeilen 118-120),
  111 während die Extraktion von Files aus dem Archiv in get_cmd nach dem Muster
  112 in Zeilen 74-75 festzulegen ist. 
  113 
  114 Damit wäre eigentlich die Aufgabe erledigt, beliebige Fileformate
  115 zu erkennen und Informationen aus diesen Files gefiltert anzuzeigen. Wie
  116 man sowohl an der Benutzung von lesspipe.sh als auch an der häufigen
  117 Benutzung von Pipes in der Funktion show sieht, müssen die Filter von
  118 STDIN lesen und auf STDOUT schreiben können. Da einige Programme das aber
  119 von Haus aus nicht können, muß ein Umweg über temporäre Files gemacht
  120 werden. Wo das erforderlich war, wurden neue Funktionen definiert. Sollte
  121 ein solcher Fall neu implementiert werden müssen, kann man sich an der
  122 Funktion iszip (Zeilen 84-91) oder isrpm (Zeilen 93-103) orientieren.
  123 
  124 Die Funktion lesspipe.sh kann man z.B. nach /usr/local/bin kopieren. Um
  125 die damit erweiterte Funktionalität von less nutzen zu können, setzt man
  126 in sh-ähnlichen Shells (sh, ksh, zsh, bash)
  127 
  128 LESSOPEN ="|/usr/local/bin/lesspipe.sh %s"; export LESSOPEN
  129 
  130 In der csh und tcsh schreibt man stattdessen
  131 
  132 setenv LESSOPEN "|/usr/local/bin/lesspipe.sh %s"
  133 
  134 Dieses Skript lesspipe.sh als Erweiterung von less läuft beim Deutschen
  135 Elektronensynchrotron seit mehr als 3 Jahren auf einer Vielzahl
  136 verschiedener UNIX-Plattformen. 
  137 
  138 [1] http://www.greenwoodsoftware.com/less/
  139 [2] ftp://ftp.astron.com/pub/file
  140 [3] http://www.ifh.de/~friebel/unix/lesspipe.html
  141 
  142 Listing 1
  143 =========
  144 
  145      1	#!/bin/bash
  146      2	#==================================================================
  147      3	# lesspipe.sh, a preprocessor for less
  148      4	# Author:  Wolfgang Friebel, DESY
  149      5	#==================================================================
  150      6	tarcmd=gtar;
  151      7	filecmd='file -L';		# file (recommended file-3.27 or better)
  152      8	sep=:				# file name separator
  153      9	altsep==			# alternate separator character
  154     10	if [[ -f "$1" && "$1" = *$sep* || "$1" = *$altsep ]]; then
  155     11	  sep=$altsep
  156     12	fi
  157     13	tmp=/tmp/.lesspipe.$$		# temp file name
  158     14	trap 'rm -f $tmp $tmp.fin $tmp. $tmp.. $tmp.1' 0
  159     15	trap PIPE
  160     16	
  161     17	show () {
  162     18	  file1=${1%%$sep*}
  163     19	  rest1=${1#$file1}
  164     20	  rest11=${rest1#$sep}
  165     21	  file2=${rest11%%$sep*}
  166     22	  rest2=${rest11#$file2}
  167     23	  rest11=$rest1
  168     24	  if [[ $# = 1 ]]; then
  169     25	    type=`$filecmd "$file1" | cut -d : -f 2-`
  170     26	    get_cmd "$type" "$file1" $rest1
  171     27	    if [[ "$cmd" != "" ]]; then
  172     28	      show "-$rest1" "$cmd"
  173     29	    else
  174     30	      isfinal "$type" "$file1" $rest11
  175     31	    fi
  176     32	  elif [[ $# = 2 ]]; then
  177     33	    type=`$2 | $filecmd - | cut -d : -f 2-`
  178     34	    get_cmd "$type" "$file1" $rest1
  179     35	    if [[ "$cmd" != "" ]]; then
  180     36	      show "-$rest1" "$2" "$cmd"
  181     37	    else
  182     38	      $2 | isfinal "$type" - $rest11
  183     39	    fi
  184     40	  elif [[ $# = 3 ]]; then
  185     41	    type=`$2 | $3 | $filecmd - | cut -d : -f 2-`
  186     42	    get_cmd "$type" "$file1" $rest1
  187     43	    if [[ "$cmd" != "" ]]; then
  188     44	      show "-$rest1" "$2" "$3" "$cmd"
  189     45	    else
  190     46	      $2 | $3 | isfinal "$type" - $rest11
  191     47	    fi
  192     48	  elif [[ $# = 4 ]]; then
  193     49	    type=`$2 | $3 | $4 | $filecmd - | cut -d : -f 2-`
  194     50	    get_cmd "$type" "$file1" $rest1
  195     51	    if [[ "$cmd" != "" ]]; then
  196     52	      echo "$0: Too many levels of encapsulation"
  197     53	    else
  198     54	      $2 | $3 | $4 | isfinal "$type" - $rest11
  199     55	    fi
  200     56	  fi
  201     57	}
  202     58	
  203     59	get_cmd () {
  204     60	  cmd=
  205     61	  if [[ "$1" = *bzip* || "$1" = *compress* ]]; then
  206     62	    if [[ "$3" = $sep$sep ]]; then
  207     63	      return
  208     64	    elif [[ "$1" = *bzip* ]]; then
  209     65	      cmd="bzip2 -c -d $2"
  210     66	    else
  211     67	      cmd="gzip -c -d $2"
  212     68	    fi
  213     69	    return
  214     70	  fi
  215     71	    
  216     72	  rest1=$rest2
  217     73	  if [[ "$file2" != "" ]]; then
  218     74	    if [[ "$1" = *tar* ]]; then
  219     75	      cmd="$tarcmd Oxf $2 $file2"
  220     76	    elif [[ "$1" = *RPM* ]]; then
  221     77	      cmd="isrpm $2 $file2"
  222     78	    elif [[ "$1" = *Zip* ]]; then
  223     79	      cmd="iszip $2 $file2"
  224     80	    fi
  225     81	  fi
  226     82	}
  227     83	
  228     84	iszip () {
  229     85	  if [[ "$1" = - ]]; then
  230     86	    rm -f $tmp
  231     87	    cat > $tmp
  232     88	    set $tmp "$2"
  233     89	  fi
  234     90	  unzip -avp "$1" "$2"
  235     91	}
  236     92	
  237     93	isrpm () {
  238     94	  if [[ "$1" = - ]]; then
  239     95	    rm -f $tmp
  240     96	    cat > $tmp
  241     97	    set $tmp "$2"
  242     98	  fi
  243     99	  echo $tmp.1 > $tmp.
  244    100	  rm -f $tmp.1
  245    101	  rpm2cpio $1|cpio -i --quiet --rename-batch-file $tmp. ${2##/}
  246    102	  cat $tmp.1
  247    103	}
  248    104	
  249    105	isfinal() {
  250    106	  if [[ "$3" = $sep || "$3" = $sep$sep ]]; then
  251    107	    cat $2
  252    108	    return
  253    109	  elif [[ "$2" = - && ( "$1" = *RPM* || "$1" = *Zip* ) ]]; then
  254    110	    cat > $tmp.fin
  255    111	    set "$1" $tmp.fin
  256    112	  fi
  257    113	  if [[ "$1" = *No\ such* ]]; then
  258    114	    return
  259    115	  elif [[ "$1" = *directory* ]]; then
  260    116	  echo "==> This is a directory, showing the output of ls -lAL"
  261    117	    ls -lAL "$2"
  262    118	  elif [[ "$1" = *tar* ]]; then
  263    119	  echo "==> use tar_file${sep}contained_file to view a file in the archive"
  264    120	    $tarcmd tvf "$2"
  265    121	  elif [[ "$1" = *RPM* ]]; then
  266    122	  echo "==> use RPM_file${sep}contained_file to view a file in the RPM"
  267    123	    rpm -p "$2" -qiv
  268    124	    rpm2cpio $2|cpio -i -tv --quiet
  269    125	  elif [[ "$1" = *roff* ]]; then
  270    126	  echo "==> append $sep to filename to view the nroff source"
  271    127	    groff -s -p -t -e -Tascii -mandoc ${2#-}
  272    128	  elif [[ "$1" = *executable* ]]; then
  273    129	  echo "==> append $sep to filename to view the binary file"
  274    130	    strings ${2#-}
  275    131	  elif [[ "$1" = *Zip* ]]; then
  276    132	  echo "==> use zip_file${sep}contained_file to view a file in the archive"
  277    133	    unzip -lv "$2"
  278    134	  elif [[ "$1" = *HTML* ]]; then
  279    135	  echo "==> append $sep to filename to view the HTML source"
  280    136	    LESSOPEN=
  281    137	    w3m -dump -X -T text/html "$2"
  282    138	  elif [[ "$2" = - ]]; then
  283    139	    cat
  284    140	  fi
  285    141	}
  286    142	
  287    143	show "$a"