Call a shell command from Python

Wildman best_lay at yahoo.com
Tue Nov 1 01:00:52 EDT 2016


On Tue, 01 Nov 2016 12:08:52 +1100, Ben Finney wrote:

> Wildman via Python-list <python-list at python.org> writes:
> 
>> On Mon, 31 Oct 2016 15:44:13 +1100, Ben Finney wrote:
>>
>> > One immediate difference I see is that you specify different
>> > arguments to ‘grep’. You have a different pattern for each command.
>> > 
>> > * The ‘^user\:’ pattern matches “user\:” at the start of a line.
>> > 
>> > * The ‘^$USER\:’ pattern I think won't match anything, since “$” matches
>> >   end-of-line and then you expect further characters *past* the end of
>> >   the line. I think that will always fail to match any line.
>>
>> Yes, the '^' indicates the start of the line and the ':' indicates
>> the character where to stop.  The colon has a special meaning so it
>> has to be escaped, '\:'.  The dollar sign precedes a variable.  In
>> this case it is an environment variable.
> 
> The ‘grep’ program you're invoking knows nothing of such variables, and
> the ‘$’ sign means to ‘grep’ what I said above.

You are correct about that but, in this case grep never "sees" the '$'
sign.  Bash expands $USER to the actual user name beforehand.  If you
are on a Linux system, enter this into a terminal to illustrate:

sudo grep ^$USER\: /etc/shadow

If the user name is ben then grep would see this:

grep ben\: /etc/shadow

>> > Maybe you are expecting Bash to be involved somehow (and so “$USER”
>> > will be substituted by Bash with some other value). That's not what
>> > happens.
>>
>> No, the shell is already running.
> 
> I don't know what you mean by this. If you mean that some *other*
> instances of the shell ar running: that isn't relevant to how your
> Python program invokes a subprocess.

I simply meant that the script is run from a terminal.

> The shell is not involved in the command as you invoke it directly as a
> subprocess, without asking for a shell.
> 
>> And $USER will be substituted by the name of the user that invoked the
>> shell.
> 
> It will not, because there is no shell involved: your Python program
> invokes ‘sudo’, which invokes ‘grep’. The shell is never involved in
> that chain, so its substitutions rules are irrelevant.

I think my terminology is causing confusion.  I apologize for that. 

-- 
<Wildman> GNU/Linux user #557453



More information about the Python-list mailing list