diff --git a/src/basic/generate-af-list.sh b/src/basic/generate-af-list.sh index 0a5c5c4cd7..f747e0d065 100755 --- a/src/basic/generate-af-list.sh +++ b/src/basic/generate-af-list.sh @@ -1,7 +1,8 @@ -#!/bin/sh +#!/bin/bash # SPDX-License-Identifier: LGPL-2.1-or-later set -eu +set -o pipefail -$1 -E -dM -include sys/socket.h -include "$2" -include "$3" - / d' $i + sed -i -e 's/__user //g' -e '/^#include / d' "$i" done diff --git a/src/boot/efi/no-undefined-symbols.sh b/src/boot/efi/no-undefined-symbols.sh index b9541c3126..8bdb16accf 100755 --- a/src/boot/efi/no-undefined-symbols.sh +++ b/src/boot/efi/no-undefined-symbols.sh @@ -1,8 +1,9 @@ -#!/bin/sh +#!/bin/bash # SPDX-License-Identifier: LGPL-2.1-or-later set -eu +set -o pipefail -if nm -D -u "$1" | grep ' U '; then +if nm -D -u "${1:?}" | grep ' U '; then echo "Undefined symbols detected!" exit 1 fi diff --git a/src/libsystemd/sd-journal/generate-audit_type-list.sh b/src/libsystemd/sd-journal/generate-audit_type-list.sh index d5b145f31d..aad653c128 100755 --- a/src/libsystemd/sd-journal/generate-audit_type-list.sh +++ b/src/libsystemd/sd-journal/generate-audit_type-list.sh @@ -1,16 +1,17 @@ -#!/bin/sh +#!/bin/bash # SPDX-License-Identifier: LGPL-2.1-or-later set -eu +set -o pipefail -cpp="$1" +cpp="${1:?}" shift -includes="" +includes=() for i in "$@"; do - includes="$includes -include $i" + includes+=(-include "$i") done -$cpp -dM $includes - $D/empty +sfdisk -d "$D/zzz" | grep -v -e 'sector-size' -e '^$' >"$D/empty" -cmp $D/empty - <$D/definitions/root.conf <"$D/definitions/root.conf" <$D/definitions/home.conf <"$D/definitions/home.conf" <$D/definitions/swap.conf <"$D/definitions/swap.conf" <$D/populated +sfdisk -d "$D/zzz" | grep -v -e 'sector-size' -e '^$' >"$D/populated" -cmp $D/populated - <$D/definitions/swap.conf <"$D/definitions/swap.conf" <$D/definitions/extra.conf <"$D/definitions/extra.conf" <>$D/definitions/home.conf -echo "UUID=b0b1b2b3b4b5b6b7b8b9babbbcbdbebf" >>$D/definitions/home.conf +echo "Label=ignored_label" >>"$D/definitions/home.conf" +echo "UUID=b0b1b2b3b4b5b6b7b8b9babbbcbdbebf" >>"$D/definitions/home.conf" -$repart $D/zzz --dry-run=no --seed=$SEED --definitions=$D/definitions +"$repart" "$D/zzz" --dry-run=no --seed="$SEED" --definitions="$D/definitions" -sfdisk -d $D/zzz | grep -v -e 'sector-size' -e '^$' >$D/populated2 +sfdisk -d "$D/zzz" | grep -v -e 'sector-size' -e '^$' >"$D/populated2" -cmp $D/populated2 - <$D/populated3 +sfdisk -d "$D/zzz" | grep -v -e 'sector-size' -e '^$' >"$D/populated3" -cmp $D/populated3 - <$D/definitions/extra2.conf <"$D/definitions/extra2.conf" <$D/populated4 +sfdisk -d "$D/zzz" | grep -v -e 'sector-size' -e '^$' >"$D/populated4" -cmp $D/populated4 - < /dev/null ; then +if [ "$(id -u)" -eq 0 ] && type -P cryptsetup diff losetup >/dev/null ; then echo "### Testing Format=/Encrypt=/CopyFiles=" # These tests require privileges unfortunately - cat >$D/definitions/extra3.conf <"$D/definitions/extra3.conf" <$D/populated5 + sfdisk -d "$D/zzz" | grep -v -e 'sector-size' -e '^$' >"$D/populated5" - cmp $D/populated5 - < /dev/null - umount $D/mount + cryptsetup close --deferred "$VOLUME" + losetup -d "$LOOP" + diff -r "$D/mount/def" "$D/definitions" >/dev/null + umount "$D/mount" else echo "### Skipping Format=/Encrypt=/CopyFiles= test, lacking privileges or missing cryptsetup/diff/losetup" fi echo "### Testing json output ###" -$repart $D/zzz --size=3G --dry-run=no --seed=$SEED --definitions=$D/definitions --json=help -$repart $D/zzz --size=3G --dry-run=no --seed=$SEED --definitions=$D/definitions --json=pretty -$repart $D/zzz --size=3G --dry-run=no --seed=$SEED --definitions=$D/definitions --json=short +"$repart" "$D/zzz" --size=3G --dry-run=no --seed="$SEED" --definitions="$D/definitions" --json=help +"$repart" "$D/zzz" --size=3G --dry-run=no --seed="$SEED" --definitions="$D/definitions" --json=pretty +"$repart" "$D/zzz" --size=3G --dry-run=no --seed="$SEED" --definitions="$D/definitions" --json=short diff --git a/src/shared/generate-ip-protocol-list.sh b/src/shared/generate-ip-protocol-list.sh index 749a1305c1..1144e8027f 100755 --- a/src/shared/generate-ip-protocol-list.sh +++ b/src/shared/generate-ip-protocol-list.sh @@ -1,8 +1,9 @@ -#!/bin/sh +#!/bin/bash # SPDX-License-Identifier: LGPL-2.1-or-later set -eu +set -o pipefail -$1 -dM -include netinet/in.h - / { next } /^#define[ \t]+(KEY|BTN)_[^ ]+[ \t]+[0-9BK]/ { print $2 } ' diff --git a/tools/add-git-hook.sh b/tools/add-git-hook.sh index 66bbcd64ea..8cff62e864 100755 --- a/tools/add-git-hook.sh +++ b/tools/add-git-hook.sh @@ -2,9 +2,9 @@ # SPDX-License-Identifier: LGPL-2.1-or-later set -eu -cd "$MESON_SOURCE_ROOT" +cd "${MESON_SOURCE_ROOT:?}" -if [ ! -f .git/hooks/pre-commit.sample -o -f .git/hooks/pre-commit ]; then +if [ ! -f .git/hooks/pre-commit.sample ] || [ -f .git/hooks/pre-commit ]; then exit 2 # not needed fi diff --git a/tools/check-api-docs.sh b/tools/check-api-docs.sh index 283e7a64d7..0bf053b5ff 100755 --- a/tools/check-api-docs.sh +++ b/tools/check-api-docs.sh @@ -1,31 +1,32 @@ -#!/bin/sh +#!/bin/bash # SPDX-License-Identifier: LGPL-2.1-or-later set -eu +set -o pipefail sd_good=0 sd_total=0 udev_good=0 udev_total=0 -deprecated=" +deprecated=( -e sd_bus_try_close -e sd_bus_process_priority -e sd_bus_message_get_priority -e sd_bus_message_set_priority -e sd_seat_can_multi_session -e sd_journal_open_container -" +) -for symbol in `nm -g --defined-only "$@" | grep " T " | cut -d" " -f3 | grep -wv $deprecated | sort -u` ; do - if test -f ${MESON_BUILD_ROOT}/man/$symbol.3 ; then +for symbol in $(nm -g --defined-only "$@" | grep " T " | cut -d" " -f3 | grep -wv "${deprecated[@]}" | sort -u); do + if test -f "${MESON_BUILD_ROOT:?}/man/$symbol.3"; then echo "✓ Symbol $symbol() is documented." good=1 else - printf " \x1b[1;31mSymbol $symbol() lacks documentation.\x1b[0m\n" + echo -e " \x1b[1;31mSymbol $symbol() lacks documentation.\x1b[0m" good=0 fi - case $symbol in + case "$symbol" in sd_*) ((sd_good+=good)) ((sd_total+=1)) diff --git a/tools/check-directives.sh b/tools/check-directives.sh index 2274d36e60..0661da4d3b 100755 --- a/tools/check-directives.sh +++ b/tools/check-directives.sh @@ -1,6 +1,7 @@ #!/usr/bin/env bash # SPDX-License-Identifier: LGPL-2.1-or-later set -eu +set -o pipefail SOURCE_ROOT="${1:?Missing argument: project source root}" BUILD_ROOT="${2:?Missing argument: project build root}" diff --git a/tools/check-help.sh b/tools/check-help.sh index 721dec4c64..8e7d236dd9 100755 --- a/tools/check-help.sh +++ b/tools/check-help.sh @@ -1,30 +1,41 @@ -#!/bin/sh +#!/bin/bash # SPDX-License-Identifier: LGPL-2.1-or-later set -eu +set -o pipefail +# Note: `grep ... >/dev/null` instead of just `grep -q` is used intentionally +# here, since `grep -q` exits on the first match causing SIGPIPE being +# sent to the sender. + +BINARY="${1:?}" export SYSTEMD_LOG_LEVEL=info +if [[ ! -x "$BINARY" ]]; then + echo "$BINARY is not an executable" + exit 1 +fi + # output width -if "$1" --help | grep -v 'default:' | grep -E -q '.{80}.'; then - echo "$(basename "$1") --help output is too wide:" - "$1" --help | awk 'length > 80' | grep -E --color=yes '.{80}' +if "$BINARY" --help | grep -v 'default:' | grep -E '.{80}.' >/dev/null; then + echo "$(basename "$BINARY") --help output is too wide:" + "$BINARY" --help | awk 'length > 80' | grep -E --color=yes '.{80}' exit 1 fi # --help prints something. Also catches case where args are ignored. -if ! "$1" --help | grep -q .; then - echo "$(basename "$1") --help output is empty." +if ! "$BINARY" --help | grep . >/dev/null; then + echo "$(basename "$BINARY") --help output is empty." exit 2 fi # no --help output to stdout -if "$1" --help 2>&1 1>/dev/null | grep .; then - echo "$(basename "$1") --help prints to stderr" +if "$BINARY" --help 2>&1 1>/dev/null | grep .; then + echo "$(basename "$BINARY") --help prints to stderr" exit 3 fi # error output to stderr -if ! "$1" --no-such-parameter 2>&1 1>/dev/null | grep -q .; then - echo "$(basename "$1") with an unknown parameter does not print to stderr" +if ! ("$BINARY" --no-such-parameter 2>&1 1>/dev/null || :) | grep . >/dev/null; then + echo "$(basename "$BINARY") with an unknown parameter does not print to stderr" exit 4 fi diff --git a/tools/find-build-dir.sh b/tools/find-build-dir.sh index e449b6e865..79a79fcc58 100755 --- a/tools/find-build-dir.sh +++ b/tools/find-build-dir.sh @@ -1,12 +1,12 @@ #!/bin/sh # SPDX-License-Identifier: LGPL-2.1-or-later -set -e +set -eu # Try to guess the build directory: # we look for subdirectories of the parent directory that look like ninja build dirs. -if [ -n "$BUILD_DIR" ]; then - echo "$(realpath "$BUILD_DIR")" +if [ -n "${BUILD_DIR:=}" ]; then + realpath "$BUILD_DIR" exit 0 fi @@ -14,20 +14,20 @@ root="$(dirname "$(realpath "$0")")" found= for i in "$root"/../*/build.ninja; do - c="$(dirname $i)" + c="$(dirname "$i")" [ -d "$c" ] || continue [ "$(basename "$c")" != mkosi.builddir ] || continue if [ -n "$found" ]; then - echo 'Found multiple candidates, specify build directory with $BUILD_DIR' >&2 + echo "Found multiple candidates, specify build directory with \$BUILD_DIR" >&2 exit 2 fi found="$c" done if [ -z "$found" ]; then - echo 'Specify build directory with $BUILD_DIR' >&2 + echo "Specify build directory with \$BUILD_DIR" >&2 exit 1 fi -echo "$(realpath $found)" +realpath "$found" diff --git a/tools/find-double-newline.sh b/tools/find-double-newline.sh index 7ea6de8311..2999a58c0b 100755 --- a/tools/find-double-newline.sh +++ b/tools/find-double-newline.sh @@ -1,38 +1,40 @@ #!/bin/sh # SPDX-License-Identifier: LGPL-2.1-or-later -TOP=`git rev-parse --show-toplevel` +set -eu -case "$1" in +TOP="$(git rev-parse --show-toplevel)" + +case "${1:-}" in recdiff) - if [ "$2" = "" ] ; then + if [ "${2:-}" = "" ] ; then DIR="$TOP" else DIR="$2" fi - find $DIR -type f \( -name '*.[ch]' -o -name '*.xml' \) -exec $0 diff \{\} \; + find "$DIR" -type f \( -name '*.[ch]' -o -name '*.xml' \) -exec "$0" diff \{\} \; ;; recpatch) - if [ "$2" = "" ] ; then + if [ "${2:-}" = "" ] ; then DIR="$TOP" else DIR="$2" fi - find $DIR -type f \( -name '*.[ch]' -o -name '*.xml' \) -exec $0 patch \{\} \; + find "$DIR" -type f \( -name '*.[ch]' -o -name '*.xml' \) -exec "$0" patch \{\} \; ;; diff) - T=`mktemp` - sed '/^$/N;/^\n$/D' < "$2" > "$T" + T="$(mktemp)" + sed '/^$/N;/^\n$/D' <"${2:?}" >"$T" diff -u "$2" "$T" rm -f "$T" ;; patch) - sed -i '/^$/N;/^\n$/D' "$2" + sed -i '/^$/N;/^\n$/D' "${2:?}" ;; *) diff --git a/tools/find-tabs.sh b/tools/find-tabs.sh index 54d922975c..6cea339ac6 100755 --- a/tools/find-tabs.sh +++ b/tools/find-tabs.sh @@ -1,38 +1,40 @@ #!/bin/sh # SPDX-License-Identifier: LGPL-2.1-or-later -TOP=`git rev-parse --show-toplevel` +set -eu -case "$1" in +TOP="$(git rev-parse --show-toplevel)" + +case "${1:-}" in recdiff) - if [ "$2" = "" ] ; then + if [ "${2:-}" = "" ] ; then DIR="$TOP" else DIR="$2" fi - find $DIR -type f \( -name '*.[ch]' -o -name '*.xml' \) -exec $0 diff \{\} \; + find "$DIR" -type f \( -name '*.[ch]' -o -name '*.xml' \) -exec "$0" diff \{\} \; ;; recpatch) - if [ "$2" = "" ] ; then + if [ "${2:-}" = "" ] ; then DIR="$TOP" else DIR="$2" fi - find $DIR -type f \( -name '*.[ch]' -o -name '*.xml' \) -exec $0 patch \{\} \; + find "$DIR" -type f \( -name '*.[ch]' -o -name '*.xml' \) -exec "$0" patch \{\} \; ;; diff) - T=`mktemp` - sed 's/\t/ /g' < "$2" > "$T" + T="$(mktemp)" + sed 's/\t/ /g' <"${2:?}" >"$T" diff -u "$2" "$T" rm -f "$T" ;; patch) - sed -i 's/\t/ /g' "$2" + sed -i 's/\t/ /g' "${2:?}" ;; *) diff --git a/tools/meson-apply-m4.sh b/tools/meson-apply-m4.sh index 7b4801ff94..35d8d159ef 100755 --- a/tools/meson-apply-m4.sh +++ b/tools/meson-apply-m4.sh @@ -1,25 +1,21 @@ -#!/bin/sh +#!/bin/bash # SPDX-License-Identifier: LGPL-2.1-or-later set -eu -CONFIG=$1 -TARGET=$2 +CONFIG="${1:?Missing path to config.h}" +TARGET="${2:?Missing target m4 file}" -if [ $# -ne 2 ]; then - echo 'Invalid number of arguments.' - exit 1 -fi - -if [ ! -f $CONFIG ]; then +if [ ! -f "$CONFIG" ]; then echo "$CONFIG not found." exit 2 fi -if [ ! -f $TARGET ]; then +if [ ! -f "$TARGET" ]; then echo "$TARGET not found." exit 3 fi -DEFINES=$(awk '$1 == "#define" && $3 == "1" { printf "-D%s ", $2 }' $CONFIG) +DEFINES=() +mapfile -t DEFINES < <(awk '$1 == "#define" && $3 == "1" { printf "-D%s\n", $2 }' "$CONFIG") -m4 -P $DEFINES $TARGET +m4 -P "${DEFINES[@]}" "$TARGET" diff --git a/tools/meson-make-symlink.sh b/tools/meson-make-symlink.sh index 96f5892281..653a73b0bd 100755 --- a/tools/meson-make-symlink.sh +++ b/tools/meson-make-symlink.sh @@ -2,6 +2,9 @@ # SPDX-License-Identifier: LGPL-2.1-or-later set -eu +SOURCE="${1:?}" +TARGET="${2:?}" + if [ "${MESON_INSTALL_QUIET:-0}" = 1 ] ; then VERBOSE="" else @@ -11,9 +14,9 @@ fi # this is needed mostly because $DESTDIR is provided as a variable, # and we need to create the target directory... -mkdir -${VERBOSE}p "$(dirname "${DESTDIR:-}$2")" -if [ "$(dirname $1)" = . -o "$(dirname $1)" = .. ]; then - ln -${VERBOSE}fs -T -- "$1" "${DESTDIR:-}$2" +mkdir -${VERBOSE}p "$(dirname "${DESTDIR:-}$TARGET")" +if [ "$(dirname "$SOURCE")" = . ] || [ "$(dirname "$SOURCE")" = .. ]; then + ln -${VERBOSE}fs -T -- "$SOURCE" "${DESTDIR:-}$TARGET" else - ln -${VERBOSE}fs -T --relative -- "${DESTDIR:-}$1" "${DESTDIR:-}$2" + ln -${VERBOSE}fs -T --relative -- "${DESTDIR:-}$SOURCE" "${DESTDIR:-}$TARGET" fi diff --git a/tools/meson-vcs-tag.sh b/tools/meson-vcs-tag.sh index 1ec04c76b7..8ce692498a 100755 --- a/tools/meson-vcs-tag.sh +++ b/tools/meson-vcs-tag.sh @@ -4,8 +4,8 @@ set -eu set -o pipefail -dir="$1" -fallback="$2" +dir="${1:?}" +fallback="${2:?}" # Apparently git describe has a bug where it always considers the work-tree # dirty when invoked with --git-dir (even though 'git status' is happy). Work diff --git a/tools/update-hwdb-autosuspend.sh b/tools/update-hwdb-autosuspend.sh index 7d5a9a8cf5..c69773087d 100755 --- a/tools/update-hwdb-autosuspend.sh +++ b/tools/update-hwdb-autosuspend.sh @@ -2,7 +2,7 @@ # SPDX-License-Identifier: LGPL-2.1-or-later set -eu -cd "$1" +cd "${1:?}" (curl --fail -L 'https://chromium.googlesource.com/chromiumos/platform2/+/master/power_manager/udev/gen_autosuspend_rules.py?format=TEXT'; echo) \ | base64 -d > tools/chromiumos/gen_autosuspend_rules.py diff --git a/tools/update-hwdb.sh b/tools/update-hwdb.sh index 773a959dcf..abbbb82f4b 100755 --- a/tools/update-hwdb.sh +++ b/tools/update-hwdb.sh @@ -2,7 +2,7 @@ # SPDX-License-Identifier: LGPL-2.1-or-later set -eu -cd "$1" +cd "${1:?}" unset permissive if [ "${2:-}" = "-p" ]; then @@ -28,6 +28,6 @@ if [ "${2:-}" != "-n" ]; then ( set -x ./acpi-update.py >20-acpi-vendor.hwdb.base patch -p0 -o- 20-acpi-vendor.hwdb.base <20-acpi-vendor.hwdb.patch >20-acpi-vendor.hwdb -! diff -u 20-acpi-vendor.hwdb.base 20-acpi-vendor.hwdb >20-acpi-vendor.hwdb.patch +diff -u 20-acpi-vendor.hwdb.base 20-acpi-vendor.hwdb >20-acpi-vendor.hwdb.patch && exit 1 ./ids_parser.py diff --git a/tools/update-syscall-tables.sh b/tools/update-syscall-tables.sh index 4f56aecedd..5aa8536882 100755 --- a/tools/update-syscall-tables.sh +++ b/tools/update-syscall-tables.sh @@ -2,10 +2,10 @@ # SPDX-License-Identifier: LGPL-2.1-or-later set -eu -cd "$1" && shift +cd "${1:?}" && shift curl --fail -L -o syscall-list.txt 'https://raw.githubusercontent.com/hrw/syscalls-table/master/syscall-names.text' for arch in "$@"; do - curl --fail -L -o syscalls-$arch.txt "https://raw.githubusercontent.com/hrw/syscalls-table/master/tables/syscalls-$arch" + curl --fail -L -o "syscalls-$arch.txt" "https://raw.githubusercontent.com/hrw/syscalls-table/master/tables/syscalls-$arch" done