I'm currently working on a project and currently have this code. I already improved it by having some pointers, but I want to make it more professional looking and right. What should I implement next?
installation() {
echo '------------------------------------'>&2
echo 'Installing Dependensies'>&2
echo '------------------------------------'>&2
echo "">&2
echo 'Installing pkgconf ..'>&2
apt install pkgconf
echo '------------------------------------'>&2
echo 'Installing libvte-2.91-dev ..'>&2
apt install libvte-2.91-dev
echo '------------------------------------'>&2
echo 'Installing meson ..'>&2
apt install meson
echo '------------------------------------'>&2
echo 'Installing libcairo2-dev ..'
apt install libcairo2-dev
echo '------------------------------------'>&2
echo 'Installing libpango1.0-dev ..'>&2
apt install libpango1.0-dev
echo '------------------------------------'>&2
echo 'Installing libgnutls28-dev ..'>&2
apt install libgnutls28-dev
echo '------------------------------------'>&2
echo 'Installing libgtk-3-dev ..'>&2
apt install build-essential libgtk-3-dev
echo '------------------------------------'>&2
echo 'Installing libsystemd-dev ..'>&2
apt install libsystemd-dev
echo '------------------------------------'>&2
echo 'Installing libgirepository1.0-dev ..'>&2
apt install libgirepository1.0-dev
echo '------------------------------------'>&2
echo 'Installing valac ..'>&2
apt install valac
echo '------------------------------------'>&2
echo 'Finished Installing the Dependensies'>&2
echo '------------------------------------'>&2
echo 'Cloning https://gitlab.gnome.org/GNOME/vte.git/'>&2
git clone https://gitlab.gnome.org/GNOME/vte.git/
echo 'Entering vte directory'>&2
cd vte
echo 'Building VTE'>&2
meson _build
ninja -C _build
ninja -C _build install
echo 'Done'>&2
}
installation
Any recommendations are welcome. It's pretty simple, all it does is install different dependencies.
1 Answer 1
Please start with a
shebang:
#! /usr/bin/env bash
It's unclear why you're logging ordinary messages to stderr
,
but OK, maybe that's a requirement.
Define a log
function for that, and prefer it over echo
.
echo 'Installing Dependensies'>&2
The typo is definitely not professional. Prefer the conventional spelling of "Dependencies", both here and for the "finished" message. (Pretty sure there's no "dependensy" British-ism.)
echo 'Installing pkgconf ..'>&2
apt install pkgconf
...
echo 'Installing libvte-2.91-dev ..'>&2
apt install libvte-2.91-dev
...
It just goes on and on in this vein, it makes my eyes water. DRY. Write a loop already:
for PKG in pkgconf libvte-2.91-dev ...
Or put the package names in an env var, one-per-line for convenient git diff'ing, and loop over that.
apt install ...
I wonder if you maybe want apt install -y ...
,
to prevent user prompting?
It is possible to ask apt
to install
a bunch of packages all at once in a single command.
But that would alter the apt
output and
your progress reporting, so maybe you prefer not to.
Total time spent waiting for downloads will
often be reduced if you batch requests together,
as some downloads will happen in parallel
and the bottleneck router might have lots
of bandwidth available.
You didn't show us where you're already cd
'd to,
so it's unclear where the git clone
will write to,
but I imagine you've got that worked out already.
ninja -C _build
ninja -C _build install
What a curious idiom! First build wasn't enough? Ok, I accept that maybe that's a "feature" of the build system and is really necessary for a correct install.
Here are a few non-default settings you might choose to embrace.
set -e
will bail upon error, that is,
upon running cd
, apt
, or any other command
that returns non-zero status.
It is useful for preventing an errant script
from running amok.
For example
cd /tmp/baz; git clone $URL
won't
pollute $CWD
with some annoying repo if destination dir
doesn't exist.
A related idiom is
cd /tmp/baz && git clone $URL
,
another way of insisting the dest dir exists.
set -o pipefail
is similar to set -e
, so e.g.
echo | false | false | true
will bail
instead of reporting $?
status of 0
.
I didn't notice any pipelines in your script,
but you might add some over time.
Suppose we never set the env var FOO.
set -u
will make e.g. echo ${FOO}
a fatal error,
instead of interpolating a null-string value.
Think of it as "lint for bash".
You don't need any of these. But they can help improve the robustness of what you write.
Often I will set -x
to see which stage a
script has progressed to, similar to make
.
But you have explicit echo
statements
for that, so it isn't needed in this script.
-
\$\begingroup\$ Woah you didn't just gave 101 on Shell Scripting but you made my day too :). Very help full. I'll consider them all. \$\endgroup\$user270282– user2702822023年03月19日 13:54:21 +00:00Commented Mar 19, 2023 at 13:54
apt install
will already contain that information? I ask this because I find trying to read logs full of repeated information quite frustrating. Although I do think theecho '-------'
between stages very useful. \$\endgroup\$