Ich habe ein Problem mit type.
Type erkennt interaktiv einen Alias, aber per Script nicht.
In der Hilfe zu type steht:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | help type type: type [-afptP] Name [Name ...] Zeigt Informationen über den Kommando-Typ. Für jeden NAMEn wird angezeigt, wie er interpretiert würde, wenn er als Kommando verwendet wird. Optionen: -a Zeigt alle Orte, die eine ausführbare Anwendung NAME enthalten; beinhaltet Aliase, eingebaute Shell-Kommandos und Funktionen, wenn und nur wenn die Option »-p« nicht auch genutzt wird. -f Unterdrückt das Nachschlagen von Shell-Funktionen. -P Erzwingt eine Suche nach jedem NAMEn in $PATH, auch wenn es ein Alias, eingebautes Kommando oder Funktion ist und gibt den Namen der Datenträgerdatei zurück, die ausgeführt würde. -p Gibt entweder den Namen der Datenträgerdatei zurück, die ausgeführt würde, oder nichts, wenn »type -t NAME« nicht »file« zurück gibt. -t Gibt ein einzelnes Wort aus »alias«, »keyword«, »function«, »builtin«, »file« oder »« zurück, wenn NAME ein Alias, ein reserviertes Shell-Wort, eine Shell-Funktion, ein eingebautes Shell-Kommando oder eine Datenträgerdatei ist, oder nicht gefunden wurde. |
Das Skript:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | if [[ $# -ne 1 ]]; then echo "Usage: wasmacht.sh JENES" exit fi PROG=$1 typ=$(type -t $PROG | head -n 1) case $typ in function|alias|buitin|keyword) type $PROG exit 0 ;; *) echo "Typ: file or unknown" esac |
Shebang ist bin/bash, Skript im Pfad, es funktioniert wenn mit Shellprogramm, binärem Programm oder Schlüsselwort aufgerufen wird, aber nicht mit Builtin-Funktionen oder selbst geschriebenen:
Interaktiv:
1 2 3 4 5 6 7 8 9 10 | type type type ist eine von der Shell mitgelieferte Funktion. type kg kg ist eine Funktion. kg () { journal.sh $1 "kg"; grep " kg" ~/journal.txt } |
Aus dem Skript aufgerufen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | wasmacht.sh type Typ: file or unknown readlink: fehlender Operand „readlink --help“ liefert weitere Informationen. Usage: file [-bcEhikLlNnprsvz0] [--apple] [--mime-encoding] [--mime-type] [-e testname] [-F separator] [-f namefile] [-m magicfiles] file ... file -C [-m magicfiles] file [--help] Usage: file [-bcEhikLlNnprsvz0] [--apple] [--mime-encoding] [--mime-type] [-e testname] [-F separator] [-f namefile] [-m magicfiles] file ... file -C [-m magicfiles] file [--help] Usage: file [-bcEhikLlNnprsvz0] [--apple] [--mime-encoding] [--mime-type] [-e testname] [-F separator] [-f namefile] [-m magicfiles] file ... file -C [-m magicfiles] file [--help] |
Also die interne Bashfunktion type liefert mir 3 Usage-Hinweise nach einem readlink-Fehler.
Mit man readlink erfahre ich, dass man damit Dateien und symbolische Links untersuchen kann, aber nichts über aliase, shell-builtins oder Schlüsselwörter:
1 2 | NAME readlink - print resolved symbolic links or canonical file names |
Mit Schlüsselwörtern klappt es aber:
1 2 | wasmacht.sh case case Ist ein reserviertes Schlüsselwort der Shell. |
und, wie gesagt, interaktiv klappt es auch mit einem Alias/einer Funktion:
1 2 3 4 5 6 | type -t kg case type bc deblank function keyword builtin file alias |
Eigengewächse sind kg und deblank.
1 2 3 4 5 6 7 | for n in kg case type bc deblank ; do wasmacht.sh $n 2>/dev/null; done Typ: file or unknown case Ist ein reserviertes Schlüsselwort der Shell. Typ: file or unknown Typ: file or unknown /usr/bin/bc: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=8445e88f45af56397c58bbb3acb417d945ff6fa3, stripped Typ: file or unknown |
Die ausführlichen Infos zu bc kommen aus dem Rest des Scripts, den ich hier nicht dokumentiert habe. Man beachte: Auch das Schlüsselwort wird erkannt.
Hat jmd. eine Idee woran es liegen könnte und was ich falsch mache, oder muss ich einen Bugreport für die Bash erstellen?