Bitmap
Bitmap

Reputation: 12538

embedding Bash Script in python without using subprocess call

I have been able to use subprocess to embed bash script into python. I happen to navigate through a python code today and stumbled across this line of code below, which also embed bash script into python - using construct analogous to docstring.

#!/bin/bash -

''''echo -n
if [[ $0 == "file" ]]; then
  ..
fi
'''

Can someone throw light on this approach. What is this approach called, and perhaps the benefits associated. I can obviously see simplicity but I think there's more to this than that.

Upvotes: 3

Views: 1029

Answers (2)

Jeremy Roman
Jeremy Roman

Reputation: 16355

This is a somewhat clever way to make the file both a valid Python script and a valid bash script. Note that it does not cause a subprocess to magically be spawned. Rather, if the file is evaluated by bash, the bash script will be run, and if it is evaluated by Python, the bash script will be ignored.

It's clever, but probably not a good software engineering practice in general. It usually makes more sense to have separate scripts.

To give a more concrete example (say this file is called "polyglot"):

''''echo hello from bash
exit
'''

print('hello from python')

As you note, bash will ignore the initial quotes, and print "hello from bash", and then exit before reaching the triple quote. And Python will treat the bash script as a string, and ignore it, running the Python script below.

$ python polyglot
hello from python
$ bash polyglot
hello from bash

But naturally, this can usually (and more clearly) be refactored into two scripts, one in each language.

Upvotes: 7

Karoly Horvath
Karoly Horvath

Reputation: 96258

  1. no, that's not embedded into python, the shebang says it's a bash script
  2. the '''' is '' twice, which is just an empty string, it doesn't have any effect.
  3. the ''' is invalid, as the last ' is not closed.

Upvotes: 3

Related Questions