Избегайте запуска сценария, если переменная не определена

Нет, это не возможно. Существует только единственная команда EXTERN, и она вызывает первый, второй или третий браузер в зависимости от предыдущего числового аргумента. W3m не имеет макро-средства: Вы не можете связать ключ к последовательности команд.

Вы могли использовать внешнее макро-средство: имейте ключ, отправляют 2M когда Вы находитесь в w3m. Это потребовало бы, чтобы макро-средство знало, когда Вы находитесь в w3m. Один способ сделать это должно всегда выполнять w3m (и ничто иное) на специальном экране или tmux конфигурации.

18
08.09.2015, 19:58
5 ответов

Самый быстрый способ - это, вероятно, добавить эти две строки в начало сценария:

set -u # or set -o nounset
: "$BATCHNUM"

Первая строка устанавливает существительное опция в оболочке, запускающая скрипт, которая прерывается, если вы пытаетесь раскрыть неустановленную переменную; второй расширяет $ BATCHNUM в контексте бездействия, чтобы вызвать прерывание перед выполнением каких-либо других действий.

Если вы хотите получить более полезное сообщение об ошибке, вы можете вместо этого написать:

if [[ -z "$BATCHNUM" ]]; then
    echo "Must provide BATCHNUM in environment" 1>&2
    exit 1
fi

Или подобное.

29
27.01.2020, 19:45

Здесь нужно проверить, что BATCHNUM установлен, а не нуль.

Оболочка POSIX предоставляет Расширение параметров для этого задания. Просто добавьте эту строку перед использованием BATCHNUM:

: "${BATCHNUM:?Variable not set or empty}"

или лучше, чтобы установить значение по умолчанию для BATCHNUM, если пользователь не предоставил:

: "${BATCHNUM:=3}"
18
27.01.2020, 19:45
[ -n "$BATCHNUM" ] || { kill "$PPID"; exit 1; }
#Unless $BATCHNUM is defined and unempty, ask parent process to exit and exit w/ 1

Это будет работать на bash и в POSIX sh. Я предпочитаю не различать пустые переменные и неопределенные переменные (т.е. мне не нравится set -u , но это только я).

4
27.01.2020, 19:45

Строки

if [ -z "$BATCHNUM" ]; then
    exit 2;
fi

проверяют на пустоту $BATCHNUM. С помощью $PPID вы можете нанести любой вред своим родителям (kill $PPID). Для убийства вашего бабушки и дедушки вам необходимо получить идентификатор процесса другими способами, например, просмотреть данные в /proc/$PPID.

Однако, если ваш родитель умирает, он посылает вам сигнал (SIGHUP), поэтому вы должны поймать его в ловушку перед тем, как начать убивать кого-либо:

trap '' SIGHUP

Update: Если вы думаете, что должны убить своих родителей, вы делаете это неправильно. Просто верни значимый выходной код. Родительский скрипт должен проверить код возврата вызываемого скрипта и отреагировать соответствующим образом.

2
27.01.2020, 19:45

Чтобы проверить, определен ли BATCHNUM, и выйти, если нет:

if [ -n "${BATCHNUM-a}" ]; then
  echo >&2 "Fatal error: BATCHNUM not set"
  exit 2
fi

Если вы также хотите отклонить случай, когда BATCHNUM пуст, используйте ${BATCHNUM:+a} вместо ${BATCHNUM+a}. Информацию о конструкции расширения параметров ${VARIABLE+TEXT_IF_NULL} см., например, в руководстве bash.

Не убивайте родительский процесс. Вы не знаете, что такое родительский процесс. Если какой-то скрипт, вызывающий этот процесс, должен прерваться, заставьте его проверить статус выхода этого скрипта. Например, в сценарии № 2:

script3 || exit $?

или использовать установить -e , чтобы прервать сценарий, если любая команда возвращает состояние отказа (ненулевое).

1
27.01.2020, 19:45

Теги

Похожие вопросы