4 ms·
#0: If you're writing scripts that are destined for other users, use POSIX sh instead.
by Sir_Cmpwn 9y ago
#0: If you're writing scripts that are destined for other users, use POSIX sh instead.
- francis-io 9y agoCan you explain why?
- Sir_Cmpwn 9y agoFor portability. bash is not available everywhere, but POSIX sh is a requirement of POSIX so you can expect it to be there.
- yjftsjthsd-h 9y agoExactly: GNU bash is on most GNU/Linux systems, but: * mac OS uses an ancient version of bash * Embedded systems use busybox sh * Android uses its own version of sh * None of the BSDs come with bash, since, y'know GNU licensing EDIT: Formatting
- davewongillies 9y agoAnd to make things interesting Ubuntu uses dash as sh https://wiki.ubuntu.com/DashAsBinSh https://wiki.ubuntu.com/DashAsBinSh
- OJFord 9y ago`sh` is only supposed to be _a_ POSIX-compliant shell, it's not odd/interesting/confusing that Ubuntu uses dash any more than it is that something else uses bash. The shebang line #!/bin/sh should only be used for POSIX-compliant scripts; if it needs {bash, dash, python, etc.} it should start #!/usr/bin/env {bash, dash, python, etc.}.
- yjftsjthsd-h 9y agoIn fairness, that's just for sh; if for some reason you actually need bash you can just use `#!/usr/bin/env bash`
- mjevans 9y agoIf you actually //need// bash ask for it, not sh. This comes from more armature script authors not being precise enough with requirements, or not targeting the more common and portable spec.
- skj 9y agoNot all systems have bash.
- v_lisivka 9y agoNot all systems have POSIX, perl, python, javascript, C++, rust, go, etc., so should we write all our programs and scripts in sh?
- Goladus 9y agoThe relevant point is that all systems running bash should also be POSIX compliant. So, taking some care to avoid bash-only constructs in a shell script can reap substantial gains in portability at fairly minor cost.
- v_lisivka 9y agoWhy I should care about all systems? If targeted systems have bash4.x and GNU tools, why I should write scripts in sh? If you care about all systems, ANSI C is better choice, IMHO.
- Goladus 9y agoIf you're targeting a limited set of systems and can reasonably assume the requirements won't change in the future, obviously use whatever tools you know will be available. I write Bash and Python all the time for those reasons. But it's silly to think that there's nothing in between "complete control over target environment" and "use ANSI C so it can be compiled to any architecture and platform under the Sun." POSIX compliance will cover a lot. Try browsing /usr/bin on any Unix system you'll see plenty of use cases. I just looked at /usr/bin on my laptop and saw that mysqld_safe is a Bourne shell script, for just one example.
- wirrbel 9y agoless magic (which you start to care for if you have to use other people's magic), easier to port stuff to zsh, etc.
- reacharavindh 9y agoDo you know of any learning resources that are strictly POSIX sh instead of a specific shell? I'm looking to learn and it will be very helpful.
- kasabali 9y agoNo need to learn strict POSIX shell. If you learn bash from a good guide and it should explicitly inform you about bash specific features. This way you can learn both at the same time. On top of that you can use `checkbashisms` tool to lint your script against bash specific syntax.
- frou_dh 9y agoCheck out this presentation: https://youtu.be/olH-9b3VJfs https://youtu.be/olH-9b3VJfs And the accompanying reference site: http://shellhaters.org/ http://shellhaters.org/
- Sir_Cmpwn 9y agoHow about the standard? http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3...
- v_lisivka 9y agoAre you writing your scripts in sh instead of bash, perl, python, JavaScript?
- Sir_Cmpwn 9y agoI prefer sh over bash for most of my scripts, but I will sometimes use Python instead.
- v_lisivka 9y agoSo you use python instead of sh, but you argue that we should use sh instead of bash, perl, or python. I'm not convinced. IMHO, we should use proper tool for the job instead of making artificial limitations. Bash is proper tool in lot of cases, unless old proprietary OS or very limited embedded OS are targeted.
- chriswarbo 9y agoI disagree with this. There's nothing wrong with writing bash scripts, with a shebang like `#!/usr/bin/env bash`, just like there's nothing wrong with writing python scripts (with `#!/usr/bin/env python`), or Haskell scripts (with `#!/usr/bin/env runhaskell`), or whatever other language you like/think is appropriate/etc. It's true that bash is unavailable by default on (say) microcontrollers, but I don't see the relevance given that loads of common scripting languages aren't available by default on microcontrollers (Python, Ruby, JS, PHP, etc.). PS: With this said, don't start your bash scripts with a `sh` path like `#!/bin/sh` or `#!/usr/bin/sh`. In fact, don't use a hard-coded path like `#!/bin/bash` or `#!/usr/bin/bash` either, always use `#!/usr/bin/env bash` unless you have a good reason not to. (Whilst `/usr/bin/env` is a hard-coded path, it can also be treated as a single special-case by systems which don't follow FHS, like NixOS, GuixSD and GoboLinux).
- Sir_Cmpwn 9y agoBash is a special case where there exists a similar tool which is standardized in POSIX, and for most cases where sh is insufficient bash is probably insufficient too. Therefore POSIX sh is almost always the better choice.