Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com X-Authentication-Warning: slinky.cs.nyu.edu: pechtcha owned process doing -bs Date: Sat, 14 Sep 2002 13:52:42 -0400 (EDT) From: Igor Pechtchanski Reply-To: cygwin AT cygwin DOT com To: cygwin AT cygwin DOT com Subject: Re: Question about Cygwin process behaviour and bash interactive mode In-Reply-To: Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII On Sat, 14 Sep 2002, Chris January wrote: > If I launch a Windows command shell (cmd.exe) from, e.g. a Window shortcut, > and then run bash from that shell, bash starts interactive mode. > If I launch a Cygwin bash shell from, e.g. cygwin.bat, then run cmd from > that shell (I type cmd), a Windows command shell starts. If I then run bash > from that command shell, bash starts in non-interactive mode. > > Can anyone explain this behaviour and why bash starts in interactive mode in > one case, and non-interactive mode in the other, even though both times it > is launched from cmd.exe? Chris, My guess is that isatty() behaves differently depending on whether we have a first-level or a second-level invocation of cmd.exe... Quoting from the bash-2.05b-3 source (shell.c:462): /* First, let the outside world know about our interactive status. A shell is interactive if the `-i' flag was given, or if all of the following conditions are met: no -c command no arguments remaining or the -s flag given standard input is a terminal standard output is a terminal Refer to Posix.2, the description of the `sh' utility. */ if (forced_interactive || /* -i flag */ (!local_pending_command && /* No -c command and ... */ wordexp_only == 0 && /* No --wordexp and ... */ ((arg_index == argc) || /* no remaining args or... */ read_from_stdin) && /* -s flag with args, and */ isatty (fileno (stdin)) && /* Input is a terminal and */ isatty (fileno (stdout)))) /* output is a terminal. */ init_interactive (); else init_noninteractive (); The Posix.2 standard can be found here: http://www.educat.hu-berlin.de/doc/Posix-1003.2.txt Quoting from isatty source (newlib/libc/posix/isatty.c:12): if (fstat (fd, &buf) < 0) return 0; if (S_ISCHR (buf.st_mode)) return 1; return 0; So, isatty() simply checks if the file descriptor given is a character device or not. I'm not sure quite how this works with windows programs started from bash. Hope this helps. Igor P.S. > chris AT AVACADO ~ I'm just curious, is "avocado" in your hostname misspelled on purpose? ;-) -- http://cs.nyu.edu/~pechtcha/ |\ _,,,---,,_ pechtcha AT cs DOT nyu DOT edu ZZZzz /,`.-'`' -. ;-;;,_ igor AT watson DOT ibm DOT com |,4- ) )-,_. ,\ ( `'-' Igor Pechtchanski '---''(_/--' `-'\_) fL a.k.a JaguaR-R-R-r-r-r-.-.-. Meow! It took the computational power of three Commodore 64s to fly to the moon. It takes a 486 to run Windows 95. Something is wrong here. -- SC sig file -- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Bug reporting: http://cygwin.com/bugs.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/