Що робить -е в баш-шебангу?


32

У мене є сценарій bash з наступним:

#!/bin/bash -e

egrep "^username" /etc/passwd >/dev/null 
if[ $? -eq 0 ] 
then 
  echo "doesn't exist" 
fi

Цей сценарій не працюватиме без -e. Що -eробити для цього сценарію? Крім того, що робить $?у цьому контексті?


1
Незвичайно. Ні -eна сторінці man (я дуже хочу побачити відповідь на це). $?містить останній код виходу (той, egrepякий породжений вище).

2
@pst: -eзадокументовано під set.
Грег Хьюгілл

Ви можете спростити свій сценарій, зробивши це:if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fi
bollovan

2
Вам пропущено пробіл між ifі [. Цей сценарій не буде працювати з -e , тому що , якщо grepнічого не знаходить , то під -eсценарій буде припинити прямо там. Без цього у -eвас є повідомлення назад: статус ( $?) 0 означає, що grep знайшов користувача. Зауважте, що це, до речі, має бути "grep" ^ ім'я користувача: '(що, якщо є інший користувач із довшим ім'ям?).
Жил 'ТАК - перестань бути злим'

3
Чи #/bin/bash -eматиме такий же ефект, як #/bin/bashна лінії №1 та set -eна лінії №2?
вибухнув

Відповіді:


34

Помилка виходу. Більше прапорів

Якщо є помилка, вона вийде відразу.

$? - статус виходу минулої команди. У Linux статус виходу 0 означає, що команда була успішною. Будь-який інший статус означатиме помилку.

egrep "^ ім'я користувача" / etc / passwd> / dev / null Шукав би ім'я користувача у файлі / etc / passwd. Якщо він знаходить його, то статус виходу $? буде дорівнює 0. Якщо він не знайде, статус виходу буде чимось іншим (не 0), отже, ви будете "відлунням не існує".


Крім того, ви можете змусити сценарій працювати правильно без -e, замінивши перші два рядки на if egrep "^username" /etc/passwd >/dev/null.

1
Чому цього не setпотрібно? : - /

1
@pst: Тому що -eдано bash як аргумент командного рядка. Усі параметри, перелічені нижче set, також приймаються bash в його командному рядку - зверніть увагу на перше речення в розділі Параметри сторінки керівництва.
grawity

14

Усі комутатори командного рядка bash задокументовані в man bash.

      -e Вийдіть негайно, якщо трубопровід (який може складатися з а
              одна проста команда), команда додаткової оболонки, що додається до
              дужки або одна з команд, виконаних у складі
              список команд, доданий дужками (див. SHELL GRAMMAR
              вище) виходить із ненульовим статусом. Оболонки немає
              вийти, якщо команда, яка не працює, є частиною команди
              список відразу після деякого часу або до появи ключового слова,
              частина тесту, що відповідає за застереженням if або elif
              слова, частина будь-якої команди, виконаної в && або || список
              крім команди, що слідує за остаточним && або ||, будь-якою
              команда в конвеєрі, але остання, або якщо команда
              повернене значення інвертується! Пастка на ERR,
              якщо встановлено, виконується до виходу оболонки. Цей варіант
              стосується середовища оболонки та кожної окремої оболонки
              ronment окремо (див. ЕКОЛОГІЧНЕ ОБСЛУГОВУВАННЯ КОМАНДИ
              вище), і може призвести до закриття підшарів перед виконанням
              всі команди в допоміжній частині.

2
А-а-а. Я шукав це в людині, але, знайшовши -е у тестах файлів і ні -е під основними аргументами, я відмовився. Хороший уривок. Чому цього не setпотрібно? : - /

1

Ваш сценарій невірний, тому що

egrep "^username" /etc/passwd >/dev/null 
if[ $? -eq 0 ] 
then 
  #echo "doesn't exist" # WRONG
  echo "the USER EXISTS"
fi

статус виходу 0 - середнє - все гаразд, у випадку grep означає "ОК, знайдено рядок". статус виходу! = 0 означає, що щось не так, у випадку grep 1 означає "не знайдено", 2 означає "не вдається відкрити вхід" ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.