Нет, это не возможно. Существует только единственная команда EXTERN, и она вызывает первый, второй или третий браузер в зависимости от предыдущего числового аргумента. W3m не имеет макро-средства: Вы не можете связать ключ к последовательности команд.
Вы могли использовать внешнее макро-средство: имейте ключ, отправляют 2M
когда Вы находитесь в w3m. Это потребовало бы, чтобы макро-средство знало, когда Вы находитесь в w3m. Один способ сделать это должно всегда выполнять w3m (и ничто иное) на специальном экране или tmux конфигурации.
Самый быстрый способ - это, вероятно, добавить эти две строки в начало сценария:
set -u # or set -o nounset
: "$BATCHNUM"
Первая строка устанавливает существительное
опция в оболочке, запускающая скрипт, которая прерывается, если вы пытаетесь раскрыть неустановленную переменную; второй расширяет $ BATCHNUM
в контексте бездействия, чтобы вызвать прерывание перед выполнением каких-либо других действий.
Если вы хотите получить более полезное сообщение об ошибке, вы можете вместо этого написать:
if [[ -z "$BATCHNUM" ]]; then
echo "Must provide BATCHNUM in environment" 1>&2
exit 1
fi
Или подобное.
Здесь нужно проверить, что BATCHNUM
установлен, а не нуль.
Оболочка POSIX предоставляет Расширение параметров для этого задания. Просто добавьте эту строку перед использованием BATCHNUM
:
: "${BATCHNUM:?Variable not set or empty}"
или лучше, чтобы установить значение по умолчанию для BATCHNUM
, если пользователь не предоставил:
: "${BATCHNUM:=3}"
[ -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
, но это только я).
Строки
if [ -z "$BATCHNUM" ]; then
exit 2;
fi
проверяют на пустоту $BATCHNUM
. С помощью $PPID
вы можете нанести любой вред своим родителям (kill $PPID
). Для убийства вашего бабушки и дедушки вам необходимо получить идентификатор процесса другими способами, например, просмотреть данные в /proc/$PPID
.
Однако, если ваш родитель умирает, он посылает вам сигнал (SIGHUP
), поэтому вы должны поймать его в ловушку перед тем, как начать убивать кого-либо:
trap '' SIGHUP
Update: Если вы думаете, что должны убить своих родителей, вы делаете это неправильно. Просто верни значимый выходной код. Родительский скрипт должен проверить код возврата вызываемого скрипта и отреагировать соответствующим образом.
Чтобы проверить, определен ли 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
, чтобы прервать сценарий, если любая команда возвращает состояние отказа (ненулевое).