home | O'Reilly's CD bookshelfs | FreeBSD | Linux | Cisco | Cisco Exam  


UNIX Power Tools

UNIX Power ToolsSearch this book
Previous: 2.9 Speeding Up Your C Shell with set prompt Test Chapter 2
Logging In
Next: 2.11 Faster ksh and bash Startup with $- Test
 

2.10 Gotchas in set prompt Test

Lots of users add an if   (! $?prompt)   exit test ( 2.9 ) to their .cshrc files. It's gotten so common that some vendors add a workaround to defeat the test. For instance, some versions of the which command ( 50.8 ) set the prompt variable so that it can see your aliases "hidden" inside the $?prompt test. I've also seen a version of at that starts an interactive shell to run jobs.

If you've buried commands after if   (! $?prompt) that should only be run on interactive shells or at login time, then you may have trouble.

There are workarounds. What you'll need depends on the problem you're trying to work around.

  • The version of which on the CD-ROM works without reading your .cshrc file, so there's no problem there.

  • Here's a way to stop the standard which from reading parts of your .cshrc that you don't want it to read. The first time you log in, this scheme sets a CSHRC_READ environment variable ( 6.1 ) . The variable will be copied into all subshells ( 38.4 ) (like the one that which starts). In subshells, the test if   ($?CSHRC_READ) will branch to the end of your .cshrc file:

    if (! $?prompt) goto cshrc_end
    
    # COMMANDS BELOW HERE ARE READ ONLY BY INTERACTIVE SHELLS:
    alias foo bar
       ...
    
    if ($?CSHRC_READ) goto cshrc_end
    
    
    # COMMANDS BELOW HERE ARE READ ONLY AT LOGIN TIME:
    setenv CSHRC_READ yes
       ...
    
    cshrc_end:

  • If you have a buggy version of at ( 40.3 ) that runs jobs from interactive shells, make your own front-end to at ( 10.1 ) that sets an environment variable named AT temporarily before it submits the at job. Add a test to your .cshrc that quits if AT is set:

    
    
    
    
    
    
    ( )
     
    \at
     
    
    
    
    # at JOBS RUN INTERACTIVE SHELLS ON MY BUGGY VERSION OF UNIX.
    # WORKAROUND IS HERE AND IN THE at ALIAS BELOW:
    if ($?AT) goto cshrc_end
    
       ...
    alias at '(setenv AT yes; \at \!*)'
       ...
    
    cshrc_end:

    Most modern versions of at save a copy of your environment and restore it, later, when the at job is run. At that time, the AT environment variable will be set; the C shell will skip the parts of your .cshrc that you want it to. It's ugly, but it works.

Those workarounds probably won't solve all the problems on your version of UNIX, but I hope they'll give you some ideas.

- JP


Previous: 2.9 Speeding Up Your C Shell with set prompt Test UNIX Power Tools Next: 2.11 Faster ksh and bash Startup with $- Test
2.9 Speeding Up Your C Shell with set prompt Test Book Index 2.11 Faster ksh and bash Startup with $- Test

The UNIX CD Bookshelf Navigation The UNIX CD BookshelfUNIX Power ToolsUNIX in a NutshellLearning the vi Editorsed & awkLearning the Korn ShellLearning the UNIX Operating System