console platform portability

Difference between version 13 and 14 - Previous - Next
This page is intended as a discussion platform with the goal to possibly obtain a console behaviour improvement to being
proposed as a [TIP].

Refer also to [LV]'s question here: [console]
----
**Inventory**
In both cases discussed below, it must be differentiated between invokes from a native OS's console and invokes from e.g. a desktop icon.

***1a. console invocation of tclsh***
Called from a native console (i.e. text based command line interface), the platforms uniformly behave identically whether [tclsh] is called with or without a script as an argument.

(Note question [http://wiki.tcl.tk/21076#pagetoc216e9d5d] about Windows tclsh misbehaving when run under third-party console.)

In this case, Tk's console command is not available by default.

Under Linux/Unix/MacOS, the [stdout], [stderr] and [stdin] needs of [tclsh] will be met in the command line text window where tclsh was invoked.

Under Windows, [[fill in the details here]].


***1b. tclsh invocation from icon, etc.***
Under Windows, tclsh can be started from outside a console window - for example, from a shortcut, from the Start menu, or from the Run dialog. However, the console command is still not available.

On Linux/Lnix, the console command is '''never''' available, regardless of how Tcl is started. The stdout and stdin for the program will not be accessible in this scenario.
Tip 561 [https://core.tcl-lang.org/tips/doc/trunk/tip/561.md] is now published to add the console command to linux/unix type systems. It uses the code here [https://wiki.tcl-lang.org/page/console+for+Unix] to enable the console on systems that don't have a console command defined. It's still a work in progress as of 1/27/20. It will delay the invoking of that wiki code until the first console command is issued, which leaves stdout/stderr as is if the console command is not used.  

On MacOS X, tclsh is not an application, and thus cannot be started as such (double-clicking icon raises the dialog "please locate application to open tclsh with").

***2a. console invocation of wish***
When starting Tcl via [wish], major differences will occur:
   * The command "console" exists, but only under Windows.
   * Under Windows, a Tk-based console is opened together with a Toplevel window
   * On Unix/Linux, the console command does not exist. Output to stdout or stderr will appear in the command line text window where wish was invoked.
   * Under MacOS X, Tk opens the console as with tclsh, with a Tk toplevel created.

***2b. wish invocation from icon etc.***
Here, the behaviour differs through OS'es when invoked without argument: Under Windows and MacOS X, Tk creates a Toplevel AND a console, while under Linux/Unix Tk creates only a toplevel. Just as in the parallel case of launching a Tcl program from an icon under Linux/Unix, the stdout and stderr for the program are not accessible.

Having stated this, it seems that the use of WISH as a working tcl console should be deprecated, because it represents another workflow compared to the Linux/Unix workflow. This would imply that '''the''' simple way to invoke an interactive console in
scripts running under Windows should be deprecated, too (i.e. the console show command).

***3. starting Tk apps ***
When Tk apps are to being invoked from an icon click or whatever comparable thing, opening with an underlying tclsh always opens the GUI and a text-based console, which is normally not desired. In fact this is the only case where WISH comes in as a necessity: for starting apps without an extra console. Windows then, offers the feature of showing a Tk-console on the fly (sure, the ability to introspect a long running program on the fly can be handy - however at the cost of efficiency: programs having quite a lot of [puts] output are slowed down in execution speed when the console is hidden).
When console-based introspection is required, the app should be started via tclsh. From these considerations follow that every Tk program should include a "package require Tk" line (in some - if not many - real-world programs, it is not present, due to extensive use of wish also as the working console amongst windows users.


----
**Ideas for portability improvement**
(These ideas are noted without commenting on them in terms of value.)
   1. A console command restricted to WISH invoked with 'script' as an argument (without script, this would contradict with the existing console). '''console show''' should create a Tk-based console.
   2. An extra command line option with tclsh could help eliminate the need for a console command: -i, for interactive. This would force interactive mode, allowing introspection on running scripts (as is equally possible with '''console show'''). In contrast to the '''console''' command, the console window is visible/present all the time, which may be undesired.
   3. package require Tk automatically creates a hidden Tk-based console, when not already present (as is the case in Windows).
----
Idea 2 might be problematic, because the native shell is still active while processing tclsh + argument. But perhaps a way can be found.
However, for some system constellations this idea is very valuable. E.g. in systems with a console device separated from a graphics device. Example: Embedded systems where a Tk app should start automatically after power-up. A remote console via serial port allows hooking in a running application when necessary. Without forcing interactive mode, remote introspection is possible only by killing the Tk-app, and then start it in two steps: tclsh + source xxx.

(further comments and ideas are welcome)

<<categories>> Command | Platform Issues