You can get a lot done quite easily and concise in Python 3, for instance with the pathlib module that has methods for recursive globbing and stuff like that.
You can get a lot done quite easily and concise in Python 3, for instance with the pathlib module that has methods for recursive globbing and stuff like that.
The only other scripting language i know of that has similar backwards compatibility is Tcl. Perhaps Perl too (ignoring Perl 6 that was renamed to something else again due to it being practically a different language).
Indeed, it has been renamed to Raku (https://raku.org using the #rakulang tag on social media).
Even if pyhton is installed it isn't certain if it is v.2 or 3.
Neither bash nor python seem to be preinstalled on BSDs.
We had to install it for a code review tool I built.
But despite Bash's weird syntax, I love how we can do very complex tasks within a few lines.
You have one tool that you know well. I have thousands of tools that I've learned daily and I wrap with a bash script..except when I need python/tcl or C. Most of what I do in python/tcl/C is truly complicated, needs to be fast or use a data structure other than an array: as it should be. Most of what I do in the shell is as simple as the userspace tools and bash will let it be. Write the one liner above in python without importing a library.
I think most people are spoiled by being able to install anything; I work in a locked down environment and getting anything non-sanctioned in is very difficult, and the sanctioning process is tedious if nothing else.
That, and the fact that libraries are evolving- which is why we end up with horrible things like package/library version pinning.
For instance the "os" module has an "urandom" function that does essentially the same as the "dd" in the bash script. Of course you could also read from the device so you wouldn't need to import "os". You would need to import "random" to get access to the random number generator, though, but it's still part of the standard library.
> python -c "for i in range(4): print(__import__('os').urandom(12)[__import__('random').randint(1,4):12])"
Or something like it, that bash one liner is pretty unreadable and full of side effects that may or may not be needed. A small 3 line python file would be cleaner and more readable.
This can break quite fast if you rely on something from Bash 4 (released 11 years ago, still not on OS X by default), or some command-line tools that's either not installed or uses switches/functions only available in their GNU incarnations.
For anything that involves more than one file or with a line count going into triple digits, I wouldn't recommend bash. And heck, for those kind of scripts, I'd go one step further and stick with plain 'sh', just to be really sure. Bash adds little. GNU missed the train of transitioning to something like ksh93, probably because RMS thought that everyone would be using Guile once Hurd is out. (I once worked with a pretty large piece of software for packaking/administration mostly written in ksh93, as this was more palatable for commercial Unix users -- not as important these days where you won't run into AIX, HP-UX and Irix anymore)
For anything more involved than a few straightfoward lines, I'd probably still pick Perl 5. Very common, especially as some operating systems/distros have it in their core tooling (e.g. CentOS) and because it's included in git, so even available on Windows. Standard functionality is good enough and it's no big jump from sh/awk/sed. Rather do that before I depend on some obscure gawk function or gsed switch, especially as it's really hard to tell whether that's proprietary or in what version it was first introduced. Cross-browser checking is easier these days than cross-distro/unix.
Python does have a better/bigger standard library, but isn't as common and you might even run into Python 2/3 shenanigans these days.
Still, the situations where you have something moderately complex and can't install stuff should be pretty rare. Might not be able to do it for the whole system, but things like perlbrew/rbenv/nvm/pyenv-du-jour solve that mostly. At that level, Go might be an option, too.
It was quite frustrating. A lot of stuff that the shell has simple functionality for can't be done easily in python.
Examples:
* Call to chown -R. Sure, python can change file owners (os.chown()). But it has no parameter to do this recursively. You need to build a loop around it over some file iteration function.
* Call to setfacl. Can't be done with the python standard library, needs pylibacl and you can't rely on it being installed.
* Call to killall -HUP [processname]. You can send kill signals with python, but only to pids, not to process names. You'd have to parse the system process list or something like that in order to simulate.
In all cases I decided to keep the shell call, it just wasn't worth it converting that to less readable python code.
Your first example could be solved with something like
[os.chown(p, uid, gid) for p in pathlib.Path('.').rglob('*')]
Obviously this is more verbose than chown but I think it's ok in a script.
And before someone raises jq, what % of servers already have python installed vs jq?
How many of those servers have something like requests installed out of the box vs needing to fetch it via a package manager or PyPI?
jq is available in Ubuntu's universe repository along with requests.
import json
import urllib.request
tough hey
> The Requests package is recommended for a higher-level HTTP client interface.
The documentation recommends nothing of the sort, it's a direction for consumers. We all live in varied and different worlds, how many varied server environments have you been responsible for all at once? Is it really beyond your amazing programming skills to use the tools at hand in every circumstance? Perhaps it's a chance to demonstrate yet another 3rd party tool which fixes non-existent problems.
It's a few bytes difference in your script that is using requests over the numerous and plentiful stdlib options there.
Each to their own. Simply saying what I would look for.
Have any examples of your apt install jq script? How would you install jq on a few hundred machines also?
I'd be happy to share an example of an out of the box python script that does the same job and works virtually everywhere.