2016-09-30 3 views
0

In einer Bash-Datei s.sh habe ich eine Executor-Funktion, an die ich die auszuführenden Befehle übergebe. Wenn ein Befehl nicht wie erwartet funktioniert, gibt diese Funktion den Befehl aus.Die Bash-Funktion führt den Eingabebefehl nicht aus

Executor() 
{ 
    if ! $* 
    then 
     echo "$*" 
     exit 2 
    fi 
} 

Jetzt bin Aufruf ich diese Funktion -

Executor clangPath="Hello" make (Dieser verwendet wird, um den Wert von clangPath Variable als "Hallo" in der Make-Datei eingestellt)

Dies verursachte einen Fehler -

./s.sh: line 5: clangPath=Hello: command not found 
[./s.sh] Error: clangPath=Hello make 

jedoch der gleiche Befehl wie diese Ausführung funktioniert

if ! clangPath="Hello" make 
then 
    echo "HelloWorld!" 
fi 

Nachdem bei dem Fehler suchen, dachte ich, es könnte ein Fehler mit den String-Zitaten, also habe ich versucht,

exitIfFail clangPath='"Hello"' make

Auch dies in einem Fehler -

./s.sh: line 5: clangPath="Hello": command not found 
[./s.sh] Error: clangPath="Hello" make 

Was könnte der Grund für den Fehler sein?

+0

Sie könnten versuchen, wenn!/usr/bin/ksh $ * ... abhängig davon, wo & welche Shell Sie verwenden? Ich kann hier nicht testen. – FreudianSlip

+1

Siehe [Bash FAQ 050] (http://mywiki.wooledge.org/BashFAQ/050). – chepner

+0

Eww, '$ *' ... Ich glaube du mispelt '" $ @ "'. –

Antwort

1

Wenn der Zweck der Funktion einig Bash Ausdruck auszuführen ist, dann eine Fehlermeldung aus, wenn der Ausdruck (zurück Nicht-Null-Status) ausgefallen ist, dann gibt es eine Möglichkeit, dies über eval zu implementieren:

#!/bin/bash - 

function Executor() 
{ 
    eval "[email protected]" 

    if [ $? -ne 0 ] 
    then 
    echo >&2 "Failed to execute command: [email protected]" 
    exit 2 
    fi 
} 

Die Variable $? enthält den Exit-Status des zuvor ausgeführten Befehls. Also prüfen wir, ob es nicht Null ist.

Beachten Sie auch, wie wir die Fehlermeldung auf den Standardfehlerdeskriptor umleiten.

Verbrauch:

Executor ls -lh /tmp/unknown-something 
ls: cannot access /tmp/unknown-something: No such file or directory 
Failed to execute command: ls -lh /tmp/unknown-something 


Executor ls -lh /tmp 
# some file listing here... 

Die [email protected] Variable ist hier besser geeignet, als eval Dinge interpretiert selbst. Siehe $* and [email protected].

+1

Was ist mit dem ['test $?' Anti-Muster] (http://mywiki.wooledge.org/BashPitfalls#cmd.3B_.28.28_.21_.24.3F_.29.29_.7C.7C_die)? Ein einfaches 'if! eval "$ @" 'wäre kürzer, klarer und konsistenter mit der Frage und" eval "$ @" && return "ist noch einfacher. –

+0

@TobySpeight, es ist eine Frage der Präferenz. Manche mögen es als ein Anti-Muster betrachten. Aber der Stil, der in der Antwort verwendet wird, sieht für mich ziemlich klar aus. –

Verwandte Themen