Welcome to the Monastery PerlMonks

### [implementation specific to windows] writing a proper batch file for terminal start-up

by Aldebaran (Deacon)
 on Oct 15, 2019 at 22:11 UTC Need Help??

Aldebaran has asked for the wisdom of the Perl Monks concerning the following question:

I have been wanting to post more about scrabble-esque games, but I have an implementation problem that I am still struggling with. I've installed Strawberry perl, as well as git for windows, as well as a batch file from git that is to start Strawberry perl correctly which, unfortunately, I lack a reference for. The one I am going to post here has been altered from the original so as to be more verbose, at least until I get this ironed out.

As I keep working with this script, I keep commenting out the things that I don't need. After grinding this out for a few weeks, more of it is commented out than not:


C:\Strawberry>rem @echo off

C:\Strawberry>rem set drive=C:\Strawberry\

C:\Strawberry>rem set drivep=

C:\Strawberry>rem If $#\#$==$#~-1drive:~0,-1 C:\Strawberry>rem set PATH=\perl\site\bin;\perl\bin;\c\bin;C:\Windows\ +system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\Wind +owsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Strawberry\c\bin; +C:\Strawberry\perl\site\bin;C:\Strawberry\perl\bin;C:\Program Files\P +uTTY\;C:\Program Files\Git\cmd;C:\Users\tblaz\perl5\bin;%USERPROFILE% +\AppData\Local\Microsoft\WindowsApps; C:\Strawberry>rem see what values I'm replacing C:\Strawberry>set TERM Environment variable TERM not defined C:\Strawberry>set PERL_JSON_BACKEND Environment variable PERL_JSON_BACKEND not defined C:\Strawberry>set PERL_YAML_BACKEND Environment variable PERL_YAML_BACKEND not defined C:\Strawberry>rem see values other perl stuff on your system C:\Strawberry>set PERL5LIB PERL5LIB=C:\Users\tblaz\perl5\lib\perl5 C:\Strawberry>set PERL5OPT Environment variable PERL5OPT not defined C:\Strawberry>set PERL_MM_OPT PERL_MM_OPT=INSTALL_BASE=C:\\Users\\tblaz\\perl5 C:\Strawberry>set PERL_MB_OPT PERL_MB_OPT=--install_base "C:\\Users\\tblaz\\perl5" C:\Strawberry>rem set env variables C:\Strawberry>set TERM=dumb C:\Strawberry>set PERL_JSON_BACKEND=JSON::XS C:\Strawberry>set PERL_YAML_BACKEND=YAML C:\Strawberry>rem avoid collisions with other perl stuff on your syste +m C:\Strawberry>rem set PERL5LIB= C:\Strawberry>set PERL5OPT= C:\Strawberry>set PERL_MM_OPT= C:\Strawberry>set PERL_MB_OPT= C:\Strawberry>echo ---------------------------------------------- ---------------------------------------------- C:\Strawberry>echo Welcome to Strawberry Perl Portable Edition! Welcome to Strawberry Perl Portable Edition! C:\Strawberry>echo * URL - http://www.strawberryperl.com/ * URL - http://www.strawberryperl.com/ C:\Strawberry>echo * see README.portable.TXT for more info * see README.portable.TXT for more info C:\Strawberry>echo ---------------------------------------------- ---------------------------------------------- C:\Strawberry>perl -e "printf("""Perl executable: %s\nPerl version : + %vd\n""",$^X, $^V)" 2>nul Perl executable: C:\Strawberry\perl\bin\perl.exe Perl version : 5.30.0 C:\Strawberry>if ERRORLEVEL 1 echo. & echo FATAL ERROR: 'perl' does no +t work; check if your strawberry pack is complete! C:\Strawberry>echo. C:\Strawberry>cd C:\Users\tblaz\Documents\evelyn\ C:\Users\tblaz\Documents\evelyn>dir Volume in drive C is Windows Volume Serial Number is ECCC-9917 Directory of C:\Users\tblaz\Documents\evelyn 10/15/2019 12:57 PM <DIR> . 10/15/2019 12:57 PM <DIR> .. 09/10/2019 10:30 PM 16,756 1.atcroft.pl 09/04/2019 11:53 AM 1,963 1.cyr.pl ... 09/07/2019 09:04 AM 287 t — êîïèÿ.txt 09/07/2019 09:04 AM 287 t.txt 08/20/2019 03:43 PM <DIR> template_stuff 09/01/2019 03:15 PM <DIR> tja 09/11/2019 03:25 PM <DIR> translate-shell 34 File(s) 57,388 bytes 7 Dir(s) 449,137,025,024 bytes free C:\Users\tblaz\Documents\evelyn>cmd \K Microsoft Windows [Version 10.0.17763.805] (c) 2018 Microsoft Corporation. All rights reserved. C:\Users\tblaz\Documents\evelyn> [download] I would try to use my script for generating the tags for a write-up and would get this: C:\Users\tblaz\Documents\evelyn>perl 8.monktag.pl INC is C:/Strawberry/perl/site/lib C:/Strawberry/perl/vendor/lib C:/St +rawberry/perl/lib Can't locate Win32.pm in @INC (you may need to install the Win32 modul +e) (@INC contains: C:/Strawberry/perl/site/lib C:/Strawberry/perl/ven +dor/lib C:/Strawberry/perl/lib) at C:/Strawberry/perl/lib/Cwd.pm line + 605. BEGIN failed--compilation aborted. [download] Then I noticed that one of the directories that had this was given my the directory in PERL5LIB. Indeed, when I comment the line out that resets this, then the script works. So I have results, yay, ...but, I would like to pause to ask whether I am doing something stupid that I will regret. Is PERL5LIB set to null for a reason? Am I setting up my system to be playing a tug-of-war? I have 3 different perls on this system. Should they have a single common place for new modules? In the past (distant), it's seemed like the mingw install starts to fight with strawberry perl and eventually wins, leaving the strawberry perl install outmoded and dusty. Is being the directory in PERL5LIB how this value entered @INC? Also, am I doing anything useful with the following commands? C:\Strawberry>set TERM=dumb C:\Strawberry>set PERL_JSON_BACKEND=JSON::XS C:\Strawberry>set PERL_YAML_BACKEND=YAML C:\Strawberry>rem avoid collisions with other perl stuff on your syste +m C:\Strawberry>rem set PERL5LIB= C:\Strawberry>set PERL5OPT= C:\Strawberry>set PERL_MM_OPT= C:\Strawberry>set PERL_MB_OPT= [download] I hope to get back into less implementation-specific issues soon. Thanks for your comment, • Comment on [implementation specific to windows] writing a proper batch file for terminal start-up • Select or Download Code Replies are listed 'Best First'. Re: [implementation specific to windows] writing a proper batch file for terminal start-up by swl (Priest) on Oct 16, 2019 at 03:45 UTC Are you using the portable edition of Strawberry perl? If so then you might be able to simplify things by calling your code after running the portable shell (which looks like the original source for your script, BTW - https://github.com/StrawberryPerl/Perl-Dist-Strawberry/blob/master/share/portable/portableshell.bat). Doing that ensures that the Strawberry perl is the first on the path, as are its utilities, and so should avoid conflicts between perl versions. WRT setting PERL5LIB etc to blank, this is probably to avoid conflicts between perl versions. If you know your PERL5LIB variable is always for this version of Strawberry perl then you could comment it out. But then when you upgrade or change your perl, you will hit new conflicts. If you have your code set up as a standard directory structure, e.g. with the script in ./bin and any modules under ./lib, then you can use libraries like rlib to add the relative paths in your calling script. That avoids setting any environment variables, global or within a batch script. e.g. for a file in /somepath/bin/script.pl: use strict; use warnings; use rlib; # add /somepath/lib to @INC # do stuff [download] WRT a single common place for new modules, that way would lead to more conflicts between the differing perl versions, mostly for XS modules, so is best avoided. If you have your code set up as a standard directory structure, e.g. with the script in ./bin and any modules under ./lib, then you can use libraries like rlib to add the relative paths in your calling script. Ok, this is helpful and worth exploring. I must say, however, that I'm unable to follow what rlib is doing. Let's look at the source: package rlib; use strict; use vars qw($VERSION @ISA);
use lib ();
use File::Basename qw(dirname);
use File::Spec;

$VERSION = "0.02"; @ISA = qw(lib); sub _dirs { my($pkg,$file) = (caller(1))[0,1]; my @rel = @_ ? @_ : qw(../lib lib); my$dir;

# if called from package main then assume we were called
# by a script not a module

if($pkg eq 'main') { require FindBin; # hide "used only once" warning$dir = ($FindBin::Bin,$FindBin::Bin)[0];
}
else {
require Cwd;
$dir = Cwd::abs_path(dirname($file));
}

# If we were called by a package then traverse upwards
# to root of lib

while($pkg =~ /::/g) {$dir = dirname($dir); } if($^O eq 'VMS') {
require VMS::Filespec;
@rel = map { VMS::Filespec::unixify($_) } @rel; } map { File::Spec->catdir($dir,$_) } @rel; } sub import { shift->SUPER::import( _dirs(@_) ); } sub unimport { shift->SUPER::unimport( _dirs(@_) ); } 1; __END__ [download] I fail to see how _dirs is populated. Can someone talk through how this works? In particular, I do not understand the syntax of the following lines:  my($pkg,$file) = (caller(1))[0,1]; my @rel = @_ ? @_ : qw(../lib lib); [download] and  while($pkg =~ /::/g) {
[download]

The caller line gets the name of the package and file that called the use rlib. If you use caller with no arguments then it tells you about the sub it is called from, but in this case the argument tells it to go one higher in the call stack. See the docs for caller for more details.

The second line is simply setting default arguments using the ternary operator. If the arguments array @_ is empty then it will add ../lib and lib to @INC, otherwise it will work with the passed arguments.

The while loop is for cases where use rlib is called from a package like Some::Package::PP. In that case it will try to find the ancestral lib dir. It assumes caller(1) will return a file name something like /somepath/lib/Some/Package/PP.pm. The =~ /::/g will return an array of how many times the package name includes ::, and will go up that many directories to find /somepath/lib/Some. This means it will eventually add /somepath/lib/Some/../lib and /somepath/lib/Some/lib to @INC (I might be off by one on the dirs, as I have not tested, but the principle is the same).

To test the while line:

#  on windows - update quotes as needed
perl -E"my $x = q|Some::Package::PP|; say 1 while$x =~ /::/g"

#produces
1
1
[download]

I fail to see how _dirs is populated. Can someone talk through how this works? In particular, I do not understand the syntax of the following lines:

Re: [implementation specific to windows] writing a proper batch file for terminal start-up
by harangzsolt33 (Friar) on Oct 16, 2019 at 03:20 UTC
I think, the solution to your problem might be getting rid of one or more instances of perl. Just have one. Why have more?

I'm currently running 32-bit Windows XP Pro with TinyPerl 5.8.0 here. This is the only perl on my computer located at C:\BIN\PERL. In that same folder I created a file called RUN.BAT, which contains the following:

@ECHO OFF
C:\BIN\PERL\TINYPERL -I C:\BIN\PERL\LIB "%1" %2 %3
ECHO.
PAUSE

When I double-click on a PL file, I associated it with RUN.BAT, so when I click to open, it runs and the terminal window stays open until I press enter. It's a pretty simple solution. (I don't have any environmental variables set for perl. I just pass the necessary values in the command line.)

I have also downloaded an icon that looks like a blue script thingy. And I created a REG file, which ties the PL and PM and CGI extensions to that icon file. So, all PL files on my computer appear with that little blue icon. I can very easily distinguish perl scripts from other files.

So, the PERL.REG file looks like this:

REGEDIT4

[HKEY_CLASSES_ROOT\pm_auto_file]
[HKEY_CLASSES_ROOT\pm_auto_file]
@=""
[HKEY_CLASSES_ROOT\pm_auto_file\DefaultIcon]
[HKEY_CLASSES_ROOT\pm_auto_file\DefaultIcon]
@="C:\\BIN\\PERL\\PERL.ICO"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\pm_auto_file]
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\pm_auto_file\DefaultIcon]
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\pm_auto_file\DefaultIcon]
@="C:\\BIN\\PERL\\PERL.ICO"

[HKEY_CLASSES_ROOT\cgi_auto_file]
[HKEY_CLASSES_ROOT\cgi_auto_file]
@=""
[HKEY_CLASSES_ROOT\cgi_auto_file\DefaultIcon]
[HKEY_CLASSES_ROOT\cgi_auto_file\DefaultIcon]
@="C:\\BIN\\PERL\\PERL.ICO"

[HKEY_CLASSES_ROOT\cgi_auto_file\shell]
[HKEY_CLASSES_ROOT\cgi_auto_file\shell\edit]
[HKEY_CLASSES_ROOT\cgi_auto_file\shell\edit\command]

[HKEY_CLASSES_ROOT\cgi_auto_file\shell\open]
[HKEY_CLASSES_ROOT\cgi_auto_file\shell\open\command]
@="\"C:\\BIN\\PERL\\runcgi.bat\" \"%1\""

[HKEY_CLASSES_ROOT\pl_auto_file]
[HKEY_CLASSES_ROOT\pl_auto_file]
@=""
[HKEY_CLASSES_ROOT\pl_auto_file\DefaultIcon]
[HKEY_CLASSES_ROOT\pl_auto_file\DefaultIcon]
@="C:\\BIN\\PERL\\PERL.ICO"

[HKEY_CLASSES_ROOT\pl_auto_file\shell]
[HKEY_CLASSES_ROOT\pl_auto_file\shell\edit]
[HKEY_CLASSES_ROOT\pl_auto_file\shell\edit\command]

[HKEY_CLASSES_ROOT\pl_auto_file\shell\open]
[HKEY_CLASSES_ROOT\pl_auto_file\shell\open\command]
@="\"C:\\BIN\\PERL\\run.bat\" \"%1\""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\cgi_auto_file]
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\cgi_auto_file\DefaultIcon]
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\cgi_auto_file\DefaultIcon]
@="C:\\BIN\\PERL\\PERL.ICO"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\cgi_auto_file\shell]
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\cgi_auto_file\shell\edit]
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\cgi_auto_file\shell\edit\command]

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\cgi_auto_file\shell\edit\command]
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\cgi_auto_file\shell\open]
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\cgi_auto_file\shell\open\command]
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\cgi_auto_file\shell\open\command]
@="\"C:\\BIN\\PERL\\runcgi.bat\" \"%1\""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\pl_auto_file]
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\pl_auto_file\DefaultIcon]
@="C:\\BIN\\PERL\\PERL.ICO"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\pl_auto_file\shell]
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\pl_auto_file\shell\edit]
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\pl_auto_file\shell\edit\command]
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\pl_auto_file\shell\open]
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\pl_auto_file\shell\open\command]
@="\"C:\\BIN\\PERL\\run.bat\" \"%1\""
[download]

When I click on CGI files, an entirely different script runs which saves the perl output as a html file and then opens it with Internet Explorer. So, I get to see what the output might look like if the script were to run on a server.

RUNCGI.BAT:

@ECHO OFF
C:\BIN\PERL\TINYPERL -I C:\BIN\PERL\LIB "%1" > C:\BIN\PERL\OUTPUT.HTM

C:
CD "C:\Program Files\Internet Explorer"
START IEXPLORE.EXE C:\BIN\PERL\OUTPUT.HTM
EXIT
[download]

The issue is that Git for Windows comes with its own perl, as do other systems like MSYS2. If these are all in the path the simplest(?) solution is to ensure the one you want to use is pushed to the front of the path when it is needed.

In the case of Strawberry perl, the portable version comes with a script to do so, and this would appear to be the original source of the OP's script (or share a common source). See https://github.com/StrawberryPerl/Perl-Dist-Strawberry/blob/master/share/portable/portableshell.bat.

When I double-click on a PL file, I associated it with RUN.BAT, so when I click to open, it runs and the terminal window stays open until I press enter.

I have been reseaching and puzzling on this response and thank you for it. Right now, when I click on a .pl, a dos terminal with strawberry perl exe on the top appears, executes the program and then disappears before I can lay eyes on it. This would be a great time to change this. In this script:

@ECHO OFF
C:\BIN\PERL\TINYPERL -I C:\BIN\PERL\LIB "%1" %2 %3
ECHO.
PAUSE
[download]

, what are to be %2 %3 ?

I have been trying to replicate what I see here and at this link another link, but I seem to have come up short in a command prompt in administrator mode:

PS C:\Strawberry> Ftype Perl_program_file="C:\Strawberry\perl\bin\perl
+.exe" %1
Ftype : The term 'Ftype' is not recognized as the name of a cmdlet, fu
+nction, script file, or operable program. Check
the spelling of the name, or if a path was included, verify that the p
+ath is correct and try again.
At line:1 char:1
+ Ftype Perl_program_file="C:\Strawberry\perl\bin\perl.exe" %1
+ ~~~~~
+ CategoryInfo          : ObjectNotFound: (Ftype:String) [], Comma
+ndNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

PS C:\Strawberry>
[download]

The assoc command works here:

C:\Users\tblaz>assoc .pl
.pl=Perl_program_file

C:\Users\tblaz>
[download]

When I try to fold this into a useful batch file, Perl_program_file doesn't seem to do anything yet:

@echo off
rem set env variables
set TERM=dumb
set PERL_JSON_BACKEND=JSON::XS
set PERL_YAML_BACKEND=YAML
rem avoid collisions with other perl stuff on your system
rem set PERL5LIB=
set PERL5OPT=
set PERL_MM_OPT=
set PERL_MB_OPT=

perl -e "printf("""Perl executable: %%s\nPerl version   : %%vd\n""", $+^X,$^V)" 2>nul
if ERRORLEVEL==1 echo.&echo FATAL ERROR: 'perl' does not work; check i
+f your strawberry pack is complete!

Ftype Perl_program_file="C:\Strawberry\perl\bin\perl.exe" %1
ECHO.
PAUSE
[download]

When I double click on the .bat file that this is I get:

Perl executable: C:\Strawberry\perl\bin\perl.exe
Perl version   : 5.30.0
+with it.

Press any key to continue . . .
[download]

At least I can read the output, but I'm not getting this yet. Do I need to create a .reg file to reassociate .pl?

"I seem to have come up short in a command prompt in administrator mode:"

The examples you link to instruct you to open a command prompt, you have executed this in a power shell session, not a command prompt. I find it simpler, more productive and more portable just to open up a a command prompt and run the programs from there, after the initial setup. If you are using a fancy IDE it may already have such functionality available.

Update: typo excited/executed, autocorrect...

"Right now, when I click on a .pl, a dos terminal with strawberry perl exe on the top appears, executes the program and then disappears before I can lay eyes on it."

Yes, see, that's why I associated the .pl files with a bat file. Here's how to do it:

* On Windows XP, you would right-click on any .pl file, and go to "Open With..." and click on "Choose Program..." and then "Browse." Then find the bat file and put a checkmark next to "Always use the selected program to open this kind of file" and click on OK.

* On Windows 7, right-click on any .pl file, and go to "Open With..." and click on "Choose default program..." Then click on "Browse" and find the bat file and put a checkmark next to "Always use the selected program to open this kind of file" and click OK.

* On Windows 10, you have to right-click on any .pl file, and click on "Open With" and then "Choose another app" and then in the new window click "More Apps" and then scroll down and click on "Look for anther app on this PC." and then find that bat file, and put a checkmark next to "Always use this app to open .pl files." and click on OK.

The REG file changes the icon that appears next to .pl files. You can ignore that. That just changes the look and feel. If you do decide to use a custom icon for pl files, you have to get the icon file first, then edit the reg file. Make sure the paths are correct. Double-click on the reg file... and then associate the pl file with the bat file. That should be the last thing.

But you have to have the bat file ready first. I would just call it run.bat to make it short, and in your case it may look like this:

@ECHO OFF
set TERM=
set PERL_JSON_BACKEND=
set PERL_YAML_BACKEND=
set PERL5LIB=
set PERL5OPT=
set PERL_MM_OPT=
set PERL_MB_OPT=
C:\Strawberry\perl\bin\perl.exe -I C:\Strawberry\Perl\lib "%1" %2 %3
ECHO.
PAUSE
[download]

Explanation: I am not sure why you have to set all those various environmental variables in the beginning, but I am assuming that they are necessary for something. So, we clear those values first. Then we call C:\Strawberry\perl\bin\perl.exe by giving its exact location. If you say you want to run the perl.exe which is located in the folder "C:\Strawberry\perl\bin" then you can be sure that that's the version of perl that will run! Especially if you also specify the location of the lib folder, you'll definitely get that perl running, and not something else. The %1 and %2 and %3 in the command line are the arguments. The first argument is the file name which is going to be %1. And then if you pass two more arguments to your perl program, then those would be %2 and %3. You could add %4 and %5 %6 %7 %8 %9 to make a full list.

So, let's say you're in command prompt, and you enter:

C:\Strawberry\perl>run.bat example.pl Hello World

In this case, your run.bat program runs the perl program and passes two arguments "Hello" and "World" so "Hello" becomes %2 and "World" becomes %3. Your perl program will receive those arguments. On the other hand, if you omit %2 %3 %4 etc... then your perl program won't receive any arguments even if you do try to pass some arguments.

The bat file is a pretty simple program. You could try and omit all those lines that start with "set" and see what happens. I think, those are totally unnecessary, but I could be wrong.

You could insert these two lines however:

SET PATH=C:\Strawberry\perl\site\bin;%PATH%
SET PATH=C:\Strawberry\perl\bin;%PATH%

These two lines add the strawberry bin folder to the path, so if perl or your program calls any executable that may be located in Strawberry/perl/bin, then those programs get executed.

SET PATH=C:\WINDOWS;WINDOWS\SYSTEM32;C:\Strawberry\Perl\bin;
[download]

That's all you have to do, and it should work.

Okay. I am not sure what this is what you wrote:

"C:\Strawberry> Ftype Perl_program_file="C:\Strawberry\perl\bin\perl +.exe" %1 Ftype : The term 'Ftype' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. At line:1 char:1 + Ftype Perl_program_file="C:\Strawberry\perl\bin\perl.exe" %1"

If you're in the terminal window staring at command prompt, then you would run a perl script by entering the following command:

C:\Users\tblaz\Desktop>C:\Strawberry\perl\run example.pl

OR you could just enter:

C:\Users\tblaz\Desktop>run example.pl

This will work if you have added "C:\Strawberry\perl" to your system PATH. If you haven't yet, then go to Control Panel >> System >> Advanced >> Environment Variables. and find the Path string and update it by adding "C:\Strawberry\perl" to the end of the long string. Separate each path with a semi-colon ; So, your path string will probably look something like this :

Path=%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\Strawberry\Perl;

Re: [implementation specific to windows] writing a proper batch file for terminal start-up
by Anonymous Monk on Oct 17, 2019 at 08:18 UTC

Is PERL5LIB set to null for a reason?

Yes , obviously , and for the obvious reason ;)

Am I setting up my system to be playing a tug-of-war?

Pretty much

I have 3 different perls on this system. Should they have a single common place for new modules?

No, its unreliable and pointless

Create A New User
Node Status?
node history
Node Type: perlquestion [id://11107515]
Approved by Athanasius
Front-paged by Corion
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others examining the Monastery: (5)
As of 2021-01-17 22:02 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
The STEM quote I most wish I'd made is:

Results (176 votes). Check out past polls.

Notices?