Finding out the active Unix shell

Discussion in 'C Programming' started by Tom Gur, Jun 7, 2007.

  1. Tom Gur

    Tom Gur Guest

    Hi,

    It's seems that csh and tcsh acts a bit different when handling
    special characters in quotes.
    i.e: if i'll supply my program with the following arguments: -winpath
    "c:\\temp\\"
    tcsh will take it as -winpath "c:\temp\"
    and csh will take it literally (with the double-slashes).

    Is there a way for me to know what shell is currently running my
    program, so I could fit a different code for each shell ?
     
    Tom Gur, Jun 7, 2007
    #1
    1. Advertising

  2. Tom Gur

    Guest

    On 7 Jun, 08:22, Tom Gur <> wrote:
    > Hi,
    >
    > It's seems that csh and tcsh acts a bit different when handling
    > special characters in quotes.
    > i.e: if i'll supply my program with the following arguments: -winpath
    > "c:\\temp\\"
    > tcsh will take it as -winpath "c:\temp\"
    > and csh will take it literally (with the double-slashes).
    >
    > Is there a way for me to know what shell is currently running my
    > program, so I could fit a different code for each shell ?


    Not in the C language per se.

    I suggest you ask the question in comp.unix.programmer.
     
    , Jun 7, 2007
    #2
    1. Advertising

  3. "Tom Gur" <> schrieb im Newsbeitrag
    news:...
    > Hi,
    >
    > It's seems that csh and tcsh acts a bit different when handling
    > special characters in quotes.
    > i.e: if i'll supply my program with the following arguments: -winpath
    > "c:\\temp\\"
    > tcsh will take it as -winpath "c:\temp\"
    > and csh will take it literally (with the double-slashes).
    >
    > Is there a way for me to know what shell is currently running my
    > program, so I could fit a different code for each shell ?

    What has this got to do with C and why do you post this question in
    comp.lang.c?

    the environment variable $SHELL might help. But you may also check in
    comp.unix.programmer

    Bye, Jojo
     
    Joachim Schmitz, Jun 7, 2007
    #3
  4. Tom Gur <> writes:
    > It's seems that csh and tcsh acts a bit different when handling
    > special characters in quotes.

    [snip]

    Ask in comp.unix.shell.

    --
    Keith Thompson (The_Other_Keith) <http://www.ghoti.net/~kst>
    San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
    "We must do something. This is something. Therefore, we must do this."
    -- Antony Jay and Jonathan Lynn, "Yes Minister"
     
    Keith Thompson, Jun 7, 2007
    #4
  5. Tom Gur

    Tom Gur Guest

    Maybe I wasn't clear.
    I'm writing a C program (a server) that runs a Java program (an agent)
    with some arguments.
    The agent's shell is unknown, so I need to check, within my C code
    what kind of shell runs on the account that runs the agent.
    I was wondering whether you know any kind of function that can get
    environment variables - so I'll be able to check the value of $SHELL
    in the agent's machine.

    Thanks
     
    Tom Gur, Jun 7, 2007
    #5
  6. Tom Gur

    Guest

    On 7 Jun, 10:07, Tom Gur <> wrote:
    > Maybe I wasn't clear.


    Or maybe you weren't listening.

    > I'm writing a C program (a server) that runs a Java program (an agent)
    > with some arguments.
    > The agent's shell is unknown, so I need to check, within my C code
    > what kind of shell runs on the account that runs the agent.


    > I was wondering whether you know any kind of function that can get
    > environment variables - so I'll be able to check the value of $SHELL
    > in the agent's machine.


    In the C language as such there won't be any such thing.

    In the Unix APIs there may be an appropriate function but that's not
    in the remit of this group.

    You'll get better answers in a group relating to Unix - most likely
    comp.unix.programmer.

    <OffTopic>
    Unix has getenv() but the $SHELL variable does not seem to be altered
    if a new shell is launched.

    And as to why anyone would use C shells, I despair...
    </OffTopic>
     
    , Jun 7, 2007
    #6
  7. In article <>,
    Tom Gur <> wrote:

    >Maybe I wasn't clear.
    >I'm writing a C program (a server) that runs a Java program (an agent)
    >with some arguments.
    >The agent's shell is unknown, so I need to check, within my C code
    >what kind of shell runs on the account that runs the agent.


    You're still not very clear. How are you running the program?

    >I was wondering whether you know any kind of function that can get
    >environment variables - so I'll be able to check the value of $SHELL
    >in the agent's machine.


    You can use the C function getenv(), but since you talk about "the
    agent's machine" and "the account that runs the agent" it sounds
    as if testing an environment variable in the server isn't going to
    do much good. Perhaps you could have the server run a small program
    on the other machine that does 'getenv("SHELL")'.

    -- Richard
    --
    "Consideration shall be given to the need for as many as 32 characters
    in some alphabets" - X3.4, 1963.
     
    Richard Tobin, Jun 7, 2007
    #7
  8. Tom Gur

    Richard Bos Guest

    wrote:

    > On 7 Jun, 10:07, Tom Gur <> wrote:
    >
    > > I was wondering whether you know any kind of function that can get
    > > environment variables - so I'll be able to check the value of $SHELL
    > > in the agent's machine.

    >
    > In the C language as such there won't be any such thing.


    Yesno.

    > In the Unix APIs there may be an appropriate function but that's not
    > in the remit of this group.
    >
    > You'll get better answers in a group relating to Unix - most likely
    > comp.unix.programmer.
    >
    > <OffTopic>


    Not yet.

    > Unix has getenv()


    Actually, that's an ISO C function, but...

    > but the $SHELL variable does not seem to be altered if a new shell is launched.


    ....C makes no guarantees about which variables are available, let alone
    what they mean.

    So the OP could easily use a C function, but _how_ he should use this
    function does depend on the OS he uses (and frustratingly, could even
    depend on the shell he uses... so to find out which shell he has, he
    first has to find out which shell he has. Nice.)

    Richard
     
    Richard Bos, Jun 7, 2007
    #8
  9. Tom Gur

    Flash Gordon Guest

    wrote, On 07/06/07 10:20:
    > On 7 Jun, 10:07, Tom Gur <> wrote:
    >> Maybe I wasn't clear.

    >
    > Or maybe you weren't listening.
    >
    >> I'm writing a C program (a server) that runs a Java program (an agent)
    >> with some arguments.
    >> The agent's shell is unknown, so I need to check, within my C code
    >> what kind of shell runs on the account that runs the agent.

    >
    >> I was wondering whether you know any kind of function that can get
    >> environment variables - so I'll be able to check the value of $SHELL
    >> in the agent's machine.

    >
    > In the C language as such there won't be any such thing.
    >
    > In the Unix APIs there may be an appropriate function but that's not
    > in the remit of this group.
    >
    > You'll get better answers in a group relating to Unix - most likely
    > comp.unix.programmer.
    >
    > <OffTopic>
    > Unix has getenv() but the $SHELL variable does not seem to be altered
    > if a new shell is launched.


    getenv is actually part of the C standard, so the ability to use it to
    access environment variable is topical here. However, what environment
    variables are available and what they do is not topical, so you are
    correct that comp.unix.programmer is a better place for the OP to ask.

    > And as to why anyone would use C shells, I despair...
    > </OffTopic>


    Possibly because they like them :)
    --
    Flash Gordon
     
    Flash Gordon, Jun 7, 2007
    #9
  10. On Thu, 07 Jun 2007 09:07:54 -0000, in comp.lang.c , Tom Gur
    <> wrote:

    >Maybe I wasn't clear.
    >I'm writing a C program (a server) that runs a Java program (an agent)
    >with some arguments.
    >The agent's shell is unknown, so I need to check, within my C code
    >what kind of shell runs on the account that runs the agent.


    The answer is unfortunatly still the same. You need to ask the
    specialists in your os and /or compiler, since C itself has no
    facilities for doing this. Most probably there's a function called
    getenv() or something similar provided by your platform.
    --
    Mark McIntyre

    "Debugging is twice as hard as writing the code in the first place.
    Therefore, if you write the code as cleverly as possible, you are,
    by definition, not smart enough to debug it."
    --Brian Kernighan
     
    Mark McIntyre, Jun 7, 2007
    #10
  11. On Thu, 07 Jun 2007 13:42:50 +0100, in comp.lang.c , Mark McIntyre
    <> wrote:

    >On Thu, 07 Jun 2007 09:07:54 -0000, in comp.lang.c , Tom Gur
    ><> wrote:
    >
    >>Maybe I wasn't clear.
    >>I'm writing a C program (a server) that runs a Java program (an agent)
    >>with some arguments.
    >>The agent's shell is unknown, so I need to check, within my C code
    >>what kind of shell runs on the account that runs the agent.

    >
    >The answer is unfortunatly still the same. You need to ask the
    >specialists in your os and /or compiler, since C itself has no
    >facilities for doing this. Most probably there's a function called
    >getenv() or something similar provided by your platform.


    er... getenv() is of course Standard, though whether it will return
    anything useful on your platform is what you'd need to ask the
    specialists in your flavour of unix.

    --
    Mark McIntyre

    "Debugging is twice as hard as writing the code in the first place.
    Therefore, if you write the code as cleverly as possible, you are,
    by definition, not smart enough to debug it."
    --Brian Kernighan
     
    Mark McIntyre, Jun 7, 2007
    #11
  12. In article <>,
    Tom Gur <> wrote:
    >Maybe I wasn't clear.
    >I'm writing a C program (a server) that runs a Java program (an agent)
    >with some arguments.
    >The agent's shell is unknown, so I need to check, within my C code
    >what kind of shell runs on the account that runs the agent.


    Are the agent and server even running on the same system? If so then
    [OT]
    you may be able to find out the client's username and use system-
    specific functions to request information about the login shell
    registered for the user in the user's password control entry;
    unfortunately, the shell the user logs in to is not necessarily
    the shell the user is running at the time they invoke the agent
    [/OT]

    But what does the server care what shell the agent is running under?
    If the *server* executes system(), that is going to be in the context
    of the *server's* process. In order to get the agent to execute system()
    you would have to send something information back to the agent
    that the agent knows to interpret to invoke the appropriate system
    call. But you've already said that the agent is running Java, no C,
    and if you want to find out about the Java equivilent of system(),
    you will need to look in Java documentation or in a Java newsgroup.


    >I was wondering whether you know any kind of function that can get
    >environment variables - so I'll be able to check the value of $SHELL
    >in the agent's machine.


    [OT]
    There is no TCP/IP mechanism that would allow a server to
    inquire about the environment variables of the process at the far
    end of a network socket, so if this is a client-server architecture,
    the only thing you can do is have the server send a message to the
    client (agent) that the agent knows to turn in to a request to send
    back the environment information; but you've said the agent is
    running in Java, not C, so if you are programming the agent you would
    need to find out what the Java equivilent of getenv() is.

    If this is not TCP/IP client/server (e.g., if this is running through
    pipes or unix domain sockets) with both server and agent on the same
    machine, your options are system-dependant. I don't know what can
    be done in Windows. In the System V Unix family, there is no (or at least
    traditionally was no) mechanism to find out about the environment
    of another process; I don't know about the historical BSD family of
    Unices. In -some- Unix or Unix-like operating systems (SGI IRIX,
    Linux I think, possibly others), a process which starts another
    process has (clumsy) mechanisms available to get at the memory
    and environment of the child process; these mechanisms may also
    be available to processes running under high levels of authorization
    (e.g., 'root') with respect to arbitrary other processes on the same
    system. But if you are thinking about anything even close to
    this, then you are solving completely the wrong problem!
    [/OT]


    Why not solve the problem a completely different way?

    1) use tmpname() to generate a temporary file name (this is ANSI C).

    2) strcat() that filename onto the end of the string "echo \\\\ > "
    (this is ANSI C).

    3) Use system(NULL) to find out whether there is a shell there at all.
    (this is ANSI C).

    4) If there is a shell, system() the string generated in step (2).
    ANSI C promises you can submit the string; it doesn't make any promises
    about how the shell will interpret the string. check the return value of
    the system() command; if it didn't work, then this mechanism cannot be
    used so break out of this sequence.

    5) try to open and read the filename generated in (1). If you are able
    to open it and able to read it, then check to see how many \ it contained.
    If it contains a single \ then you know that whatever shell is being
    used is translating \\ into \ ; if the file contains two \ then you
    know that the shell is treating each \ literally.
    Close and remove the temporary file afterwards.

    This arrangement won't work on -every- machine, especially as not
    every machine will have an 'echo' shell command, but it will work on
    a wide variety of machines and will directly answer the question of
    whether the shell is preserving all \ or not, instead of trying to
    answer the round-about question of which shell it is and having an
    internal (necessarily incomplete) table of shell names and expected
    behaviours, together with the risk that a user might have configured
    the shell to act differently than you expect.
    --
    Programming is what happens while you're busy making other plans.
     
    Walter Roberson, Jun 7, 2007
    #12
  13. In article <f49di8$pc$>,
    Walter Roberson <-cnrc.gc.ca> wrote:
    >In article <>,
    >Tom Gur <> wrote:
    >>Maybe I wasn't clear.
    >>I'm writing a C program (a server) that runs a Java program (an agent)
    >>with some arguments.
    >>The agent's shell is unknown, so I need to check, within my C code
    >>what kind of shell runs on the account that runs the agent.

    >
    >Are the agent and server even running on the same system? If so then
    >[OT]


    You guys need to work on your reading comprehension skills.

    I believe the issue is that different shells parse user input
    differently. I.e., for a given sequence of keystrokes (that the user
    types in order to invoke the program), the results (i.e., what the
    application sees in argv[]) can differ. The OP wants to eliminate this
    problem - i.e., make it so that when the user types a certain sequence of
    keystrokes to invoke his program, his program does the right thing,
    regardless of which shell lies between him and the user. Effectively,
    he wants to kludge around shell differences via application-level coding.

    Whether this is a noble or a foolish envdeavor is up to you to decide.
     
    Kenny McCormack, Jun 7, 2007
    #13
  14. Tom Gur <> writes:
    > Maybe I wasn't clear.
    > I'm writing a C program (a server) that runs a Java program (an agent)
    > with some arguments.
    > The agent's shell is unknown, so I need to check, within my C code
    > what kind of shell runs on the account that runs the agent.
    > I was wondering whether you know any kind of function that can get
    > environment variables - so I'll be able to check the value of $SHELL
    > in the agent's machine.


    This was in response to a followup in which I advised you to ask in
    comp.unix.shell. Please provide context when you post a followup; see
    <http://cfaj.freeshell.org/google/>.

    So you should ask in comp.unix.programmer rather than comp.unix.shell.

    --
    Keith Thompson (The_Other_Keith) <http://www.ghoti.net/~kst>
    San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
    "We must do something. This is something. Therefore, we must do this."
    -- Antony Jay and Jonathan Lynn, "Yes Minister"
     
    Keith Thompson, Jun 7, 2007
    #14
  15. Tom Gur

    Richard Bos Guest

    CBFalconer <> wrote:

    > Richard Bos wrote:
    > > wrote:
    > > > On 7 Jun, 10:07, Tom Gur <> wrote:
    > >>
    > >>> I was wondering whether you know any kind of function that can
    > >>> get environment variables - so I'll be able to check the value
    > >>> of $SHELL in the agent's machine.
    > >>
    > >> In the C language as such there won't be any such thing.

    > >
    > > Yesno.
    > >
    > >> In the Unix APIs there may be an appropriate function but that's
    > >> not in the remit of this group.
    > >>
    > >> You'll get better answers in a group relating to Unix - most
    > >> likely comp.unix.programmer.
    > >>
    > >> <OffTopic>

    > >
    > > Not yet.
    > >
    > >> Unix has getenv()

    > >
    > > Actually, that's an ISO C function, but...
    > >
    > >> but the $SHELL variable does not seem to be altered if a new
    > >> shell is launched.

    > >
    > > ...C makes no guarantees about which variables are available, let
    > > alone what they mean.
    > >
    > > So the OP could easily use a C function, but _how_ he should use
    > > this function does depend on the OS he uses (and frustratingly,
    > > could even depend on the shell he uses... so to find out which
    > > shell he has, he first has to find out which shell he has. Nice.)

    >
    > Who says ANY shell even exists? Not the C standard.


    getenv() exists. That's what the C Standard says. _If_ you happen to
    know about an environment variable that contains the active shell,
    getenv() can get it for you. As you indicate, you may have to cater for
    the possibility of an empty return value.

    Richard
     
    Richard Bos, Jun 8, 2007
    #15
  16. Tom Gur

    Flash Gordon Guest

    Richard Bos wrote, On 08/06/07 07:25:
    > CBFalconer <> wrote:
    >
    >> Richard Bos wrote:
    >>> wrote:
    >>>> On 7 Jun, 10:07, Tom Gur <> wrote:
    >>>>
    >>>>> I was wondering whether you know any kind of function that can
    >>>>> get environment variables - so I'll be able to check the value
    >>>>> of $SHELL in the agent's machine.
    >>>> In the C language as such there won't be any such thing.
    >>> Yesno.
    >>>
    >>>> In the Unix APIs there may be an appropriate function but that's
    >>>> not in the remit of this group.
    >>>>
    >>>> You'll get better answers in a group relating to Unix - most
    >>>> likely comp.unix.programmer.
    >>>>
    >>>> <OffTopic>
    >>> Not yet.
    >>>
    >>>> Unix has getenv()
    >>> Actually, that's an ISO C function, but...
    >>>
    >>>> but the $SHELL variable does not seem to be altered if a new
    >>>> shell is launched.
    >>> ...C makes no guarantees about which variables are available, let
    >>> alone what they mean.
    >>>
    >>> So the OP could easily use a C function, but _how_ he should use
    >>> this function does depend on the OS he uses (and frustratingly,
    >>> could even depend on the shell he uses... so to find out which
    >>> shell he has, he first has to find out which shell he has. Nice.)

    >> Who says ANY shell even exists? Not the C standard.

    >
    > getenv() exists. That's what the C Standard says. _If_ you happen to
    > know about an environment variable that contains the active shell,
    > getenv() can get it for you. As you indicate, you may have to cater for
    > the possibility of an empty return value.


    You might also want to allow for the user setting up a deliberate lie.
    --
    Flash Gordon
     
    Flash Gordon, Jun 8, 2007
    #16
  17. In article <>,
    CBFalconer <> wrote:

    >> So the OP could easily use a C function, but _how_ he should use
    >> this function does depend on the OS he uses (and frustratingly,
    >> could even depend on the shell he uses... so to find out which
    >> shell he has, he first has to find out which shell he has. Nice.)


    >Who says ANY shell even exists? Not the C standard.


    The original poster stipulated it.

    -- Richard
    --
    "Consideration shall be given to the need for as many as 32 characters
    in some alphabets" - X3.4, 1963.
     
    Richard Tobin, Jun 8, 2007
    #17
  18. In article <>,
    CBFalconer <> wrote:
    >Richard Tobin wrote:
    >> CBFalconer <> wrote:
    >>
    >>>> So the OP could easily use a C function, but _how_ he should use
    >>>> this function does depend on the OS he uses (and frustratingly,
    >>>> could even depend on the shell he uses... so to find out which
    >>>> shell he has, he first has to find out which shell he has. Nice.)

    >>
    >>> Who says ANY shell even exists? Not the C standard.

    >>
    >> The original poster stipulated it.

    >
    >Well, I guess I could accept 'implied', but not stipulated.


    Questioner: What model car did you just drive past my house in?
    Chuck: Who says this is a car?

    Yes, I think the original question implies the existence of a car.
     
    Kenny McCormack, Jun 8, 2007
    #18
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Replies:
    2
    Views:
    5,890
    Jonathan Bromley
    Feb 18, 2005
  2. Laurent Bugnion

    Finding out which sessions are still active

    Laurent Bugnion, Jan 23, 2006, in forum: ASP .Net
    Replies:
    10
    Views:
    614
    Daniel Fisher\(lennybacon\)
    Jan 24, 2006
  3. Christian Heimes
    Replies:
    0
    Views:
    630
    Christian Heimes
    Feb 27, 2008
  4. Gerardo Herzig
    Replies:
    1
    Views:
    1,141
    Philipp Pagel
    Feb 27, 2008
  5. D'Arcy J.M. Cain
    Replies:
    0
    Views:
    893
    D'Arcy J.M. Cain
    Feb 27, 2008
Loading...

Share This Page