2017-06-11 6 views
2

は助ける、魚のスクリプトfoo.fishのみプリント "foo" を考えると、またはエラー下位レベル関数からフィッシュスクリプトを中止するにはどうすればよいですか?

function foo 
    __parse_args $argv[1] 
    echo foo 
end 

function __parse_args --argument option 
    if test -z $option 
    return # No option to parse, return early 
    end 

    switch $option 
    case -h --help 
     echo "Shows this help and exits" 
     return 0 # How can we exit 0 instead of return? 
    case -\* 
     echo "Error: '$option' not a valid option" 
     return 1 # How can we exit 1 instead of return? 
    end 
end 

実際の行動:

↪ foo -h 
Shows this help and exits 
foo 

期待される動作:

↪ foo -h 
Shows this help and exits 

returnマニュアルは言います現在の内部関数を停止し、関数の終了状態を設定します。

ネストされた関数呼び出しの内部で、適切な終了コードを使用してスクリプトを早期に終了するにはどうすればよいですか?

exitはスクリプトの代わりにシェルを終了するため、使用できません。

+1

「スクリプトだけでなくシェルを終了する」とはどういう意味ですか? 'source'または' .'でスクリプトをソースしない限り、スクリプトはそれ自身のシェルで実行されます。 –

答えて

2

sourceまたは.でスクリプトを実行しない限り、スクリプトは独自の新しいシェルプロセスで実行されます。 exitコマンドはそのプロセスを終了し、スクリプトを呼び出した親シェルに戻ります。 exitへのパラメータは、終了直後にその親プロセスの内部で$statusの値になります。その後、

あなたが実際に(あなたのシェルプロンプトでsourceまたは.または入力/貼り付けを介して、または〜/ .configをして、あなたの.fishrcまたはスタートアップファイルに定義するか、どんなことで)あなたのインタラクティブシェルでfoo関数を定義している場合__parse_argsfooから戻る方法はありません。 fooは、__parse_argsの戻り値を明示的にチェックする必要があります(つまり、__parse_argsを呼び出した後に$statusをチェックしてください)。つまり、を処理するときに別の値を返すのが最大で__parse_argsであることを意味します。 fooの実際の動作は、シェル環境にいくつかの変更を伴わない場合は、

しかし、私はどこかのコマンドの検索$PATHfooという名前のファイルにこれを置くことによって、例えば、実行可能なスクリプトファイルの代わりに機能することをお勧めします:

#!/usr/bin/env fish 
function foo 
    __parse_args $argv[1] 
    echo foo 
end 

function __parse_args --argument option 
    if test -z $option 
    return # No option to parse, return early 
    end 

    switch $option 
    case -h --help 
     echo "Shows this help and exits" 
     return 0 # How can we exit 0 instead of return? 
    case -\* 
     echo "Error: '$option' not a valid option" 
     return 1 # How can we exit 1 instead of return? 
    end 
end 

foo $argv 
+0

サンプルスクリプトでは、例えば 'return 0'を' exit 0'に変更して、関数をコピーしてコピーし、 'foo -h'を実行します。実行したシェルが終了します。 'exit'マニュアルによると、(シェル)シェルから出るでしょう。ファイルのソース中にexitが呼び出された場合に限り、残りのファイルはシェル自体を終了する代わりにスキップされます。 – Dennis

+0

はい、プロンプトでのコピーと貼り付けは、 'source'や' .'と同じです - あなたは対話シェルで関数を定義してから、関数を実行するだけです。 '' fish'で複数のレベルの関数呼び出しを終了する方法はありません。私はそれをスクリプトにすることをお勧めします。 –

+0

'〜/ .config/fish/functions/foo.fish'でスクリプトを作成してもシェルは終了します。 – Dennis

0

__parse_argsでは、-hため1を返すことができ、その後、

function foo 
    __parse_args $argv[1] 
     or return $status 
    echo foo 
end 

-hの戻り値が0ではないことを示していますが、これは大きな問題ではないでしょう。

関連する問題