http://qs321.pair.com?node_id=1232358

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

If I run the "umask" command in a Linux terminal, the result is 2. I am running tcsh and have a perl script that runs the following commands:
printf("umask is %s\n", umask()); system "/usr/bin/xterm -name \"test\" -hold -e '$command' & ";

where $command is:

echo \"umask is \" ; umask; ";

The first printf() statement returns 2, but the echo called from the xterm returns 22. Why are these different, and what should I do to make the 22 a 2?

Replies are listed 'Best First'.
Re: umask when calling xterm from perl
by hippo (Bishop) on Apr 09, 2019 at 17:24 UTC

    system uses /bin/sh by default, not tcsh. How you deal with this depends on what else you want to accomplish in your shell/xterm. Do you actually want to run tcsh under system() instead?

      Does umask only apply to tcsh and not to /bin/sh (or any other shell such as bash, zsh, etc.)? Does each shell have its own separate umask? UPDATE: If I open a terminal in linux, which defaults to tcsh, and type "umask", the result is 2. If I type any of the following commands to change my shell followed by "umask", the result is still 2:

      /bin/sh ksh zsh bash

      If all of these shells have the same umask when I call them manually, why does the umask get changed when perl calls a different shell (/bin/sh in this case)?

      For the purposes of this perl script it doesn't matter which shell gets called. If system() uses /bin/sh, what about qx or the backtick operator?

        If all of these shells have the same umask when I call them manually, why does the umask get changed when perl calls a different shell (/bin/sh in this case)?

        That is the key question. I'm unable to reproduce your findings regarding the different umasks but then our operating systems (and maybe shells and maybe perls) are probably quite different. I suggest that instead of fixing just on umask you look at the entire environment to determine what is being set/reset and hopefully by that method determine the cause. If umask turns out to be the only difference then that may point to a bug somewhere.