2010-11-07 11 views
5

Bash-Befehle sind in einer interaktiven Tclsh-Sitzung verfügbar. Z.B. in einer tclsh Sitzung SieWie Bash-Befehle von Tcl-Skript aufrufen?

% ls 

statt

$ exec ls 

Allerdings haben kann, man kann ein tcl-Skript haben, die bash ruft Befehle direkt (das heißt ohne exec).

Wie kann ich Tclsh dazu bringen, bash-Befehle zu erkennen, während ich tcl-Skriptdateien interpretiere, genau wie in einer interaktiven Sitzung?

Ich denke, es gibt ein Tcl-Paket (oder etwas Ähnliches), das beim Starten einer interaktiven Sitzung automatisch geladen wird, um direkte Aufrufe von Bash-Commans zu unterstützen. Wie kann ich es manuell in tcl-Skriptdateien laden?

Antwort

7

Hier wird der unknown Proc aufgerufen, wenn Sie einen Befehl wie ls eingeben, da dies kein vorhandener tcl-Befehl ist und dieser Befehl standardmäßig überprüft, ob der Befehl von einer interaktiven Sitzung aufgerufen wurde und von der obersten Ebene (nicht indirekt in einem proc-Hauptteil) und es prüft, ob der Prozessname irgendwo auf dem Pfad existiert. Sie können so etwas erhalten, indem Sie Ihren eigenen unbekannten Prozess schreiben.

Für einen guten Start hierzu die Ausgabe von

info body unknown 
+3

+1: Dies ist der Beginn der Spur, aber ich glaube, es führt zu schlechter Code. Besser, 'exec' zu haben, ruft explizite IMO auf ... –

+0

@Donal: Ja, ich stimme zu. Explizit ist besser als implizit, und ich würde niemals empfehlen, das unbekannte Proc neu zu schreiben, um dies oder etwas anderes zu tun, außer vielleicht, um die bereits vorhandene Autoload-Funktionalität zu verbessern. – SingleNegationElimination

4

Eine Sache, die Sie wissen sollten, ist, dass ls kein Bash-Befehl ist. Es ist ein eigenständiges Dienstprogramm. Der Hinweis dafür, wie tclsh solche Dienstprogramme ausführt, ist genau dort in seinem Namen - sh bedeutet "Shell". Es ist also das grobe Äquivalent zu Bash, in dem Bash auch eine Shell ist. Tcl! = Tclsh also müssen Sie exec verwenden.

10

untersuchen Wenn Sie spezifische Dienstprogramme verfügbar in Ihrer Skripte haben möchten, schreiben Überbrückung Verfahren:

proc ls args { 
    exec {*}[auto_execok ls] {*}$args 
} 

Das wird auch Arbeit (mit offensichtlicher Anpassung) für die meisten Shell-Builtins oder unter Windows. (Um fair zu sein, wollen Sie normalerweise keinen externen ls verwenden; der interne glob Befehl reicht normalerweise, manchmal mit zusätzlicher Hilfe von einigen file Unterbefehlen.) Einige Befehle benötigen ein wenig mehr Arbeit (z. B. Umleiten der Eingabe, so dass es kommt das Terminal, mit einem extra <@stdin oder </dev/tty; das ist für stty auf einigen Plattformen erforderlich), aber das funktioniert einigermaßen gut.

Wenn Sie jedoch nach einer willkürlichen Ausführung von externen Programmen ohne zusätzlichen Code suchen, um zu markieren, dass sie extern sind, wird dies als gegen den Ethos von Tcl gerichtet angesehen. Das Problem ist, dass der Code erheblich schwieriger zu verwalten ist. Es ist nicht offensichtlich, dass Sie einen teuren Call-Out machen, anstatt etwas (relativ) billiges zu verwenden, das intern ist. Putting in exec in diesem Fall ist nicht , dass belastende ...

+1

Es ist wohl nicht nur gegen das Ethos von Tcl, es ist auch nur schlechte Programmierung im Allgemeinen. –