Сценарий оболочки продолжает работать даже после команды выхода - PullRequest
3 голосов
/ 26 октября 2011

Мой сценарий оболочки выглядит следующим образом:

#!/bin/bash

# Make sure only root can run our script
[ $EUID -ne 0 ] && (echo "This script must be run as root" 1>&2) || (exit 1)

# other script continues here...

Когда я запускаю указанный выше сценарий с пользователем без полномочий root, он печатает сообщение «Этот сценарий ...», но не завершает работу, продолжаетс оставшимся сценарием.Что я делаю не так?

Примечание: я не хочу использовать, если условие.

Ответы [ 3 ]

5 голосов
/ 26 октября 2011

Вы запускаете echo и exit в подоболочках. Выходной вызов оставит только эту подоболочку, что немного бессмысленно.

Попробуйте с:

#! /bin/sh
if [ $EUID -ne 0 ] ; then
    echo "This script must be run as root" 1>&2
    exit 1
fi
echo hello

Если по какой-то причине вам не нужно условие if, просто используйте:

#! /bin/sh
[ $EUID -ne 0 ] && echo "This script must be run as root" 1>&2 && exit 1
echo hello

Примечание: нет () и исправлено логическое условие. Предупреждение: если echo не пройден, этот тест также не будет завершен. Версия if безопаснее (и более читабельна, проще в обслуживании IMO).

1 голос
/ 26 октября 2011

Я бы написал так:

(( $EUID != 0 )) && { echo "This script must be run as root" 1>&2; exit 1; }

Использование { } для группировки, которая выполняется в текущей оболочке. Обратите внимание, что пробелы вокруг фигурных скобок и конечной точки с запятой обязательны.

1 голос
/ 26 октября 2011

Я думаю, вам нужно &&, а не ||, так как вы хотите эхо и выхода (не эхо или выхода).

Кроме того, (exit 1) запустит вспомогательную оболочку, которая выходит, а не выходит из текущей оболочки.

Следующий скрипт показывает, что вам нужно:

#!/bin/bash
[ $1 -ne 0 ] && (echo "This script must be run as root." 1>&2) && exit 1
echo Continuing...

Запуск этого с ./myscript 0 дает вам:

Continuing...

в то время как ./myscript 1 дает вам:

This script must be run as root.

Я думаю, это то, что вы искали.

...