2013-02-09 5 views
7
$ cat test.sh 
set -eu 
echo "`wc -l < $DNE`" 
echo should not get here 

$ /bin/bash test.sh 
test.sh: line 2: DNE: unbound variable 

should not get here 

Używam wersji bash 4.1.2. Czy istnieje sposób, aby upewnić się, że wszystkie takie użycie zmiennych niezwiązanych w podpowłokach spowoduje, że skrypt zakończy działanie bez konieczności modyfikowania każdego połączenia z podpowłoką?bash niezwiązana zmienna nie powodująca wyjścia z podpowłoki po ustawieniu -eu

+0

@ odpowiedź Phila pracował na Linux, OS X i Solaris. Możesz rozważyć zaakceptowanie go. – jww

+0

To przyzwoita alternatywa, ale nie spełnia wymagań oryginalnego pytania: "bez modyfikowania każdego połączenia". Jeśli flagi były zgodne z oczekiwaniami, jest bardziej ustawiona i zapomniana, niż konieczność pamiętania, aby zrobić coś za każdym razem, gdy zmienna jest używana w określonej sytuacji. – Jason

Odpowiedz

2

Użyj zmiennej tymczasowej, aby proces test.sh wiedział o niepowodzeniu wc. Można go zmienić na:

#!/bin/bash 
set -eu 
out=$(wc -l < $DNE) 
echo $out 
echo should not get here 

Teraz nie ujrzy should not get here jeśli wc zawiedzie.

+1

Dzięki, ale gdybym mógł zawsze pamiętać o poprawnym wykonaniu, w ogóle nie potrzebowałbym opcji -eu, aby złapać błędy, które bash w innym przypadku przepuściłby. Poszukuję sposobu, żeby powiedzieć bashowi, że jest mniej permisywny błędy bez zmiany całego kodu - którego dotyczy. – Jason

+0

Sprawdzasz kody powrotu każdej komendy i drukujesz odpowiedni komunikat/obsługę błędów. -e jest opcją, gdy pożądane jest wyjście z jakiejkolwiek awarii. Bash jest językiem interpretowanym, więc takie radości są tylko w językach skompilowanych :) Ale zapewnia rozsądne opcje, takie jak tutaj. –

+0

czy wierzysz, że jest jakiś sposób na zrobienie tego bez użycia '-e'? –

4

Lepszym rozwiązaniem w celu zapewnienia zmiennej odkażanie

#!/usr/bin/env bash 

set -eu 

if [[ ${1-} ]]; then 
    DNE=$1 
else 
    echo "ERROR: Please enter a valid filename" 1>&2 
    exit 1 
fi 

Umieszczając łącznik do nazwy zmiennej wewnątrz nawiasów klamrowych tak aby zdrowo bash pozwala obsłużyć zmienna jest niezdefiniowana. Ja również bardzo polecam patrząc na przewodniku redakcyjnym skorupa Google, jest to świetny Reference https://google.github.io/styleguide/shell.xml

[[ -z ${variable-} ]] \ 
    && echo "ERROR: Unset variable \${variable}" \ 
    && exit 1 \ 
    || echo "INFO: Using variable (${variable})" 
Powiązane problemy