2017-02-22 9 views
0

私は、時間間隔に基づいて出力を返すzsh関数を構築しようとしています。最初は "あなたが渇いています"という条件が真ですが、変数thirstyをコマンドラインで変更してfalseに設定した後は、最初のif文は実行されますが、変数thirstyglobal variable thirstyを変更しません。 グローバル変数thirstyを変更する方法はありますか?zshプロンプトに使用される関数のグローバル変数を変更できません

thirsty= 
last_time= 

drink_water() { 
echo -n "$thirsty" 

    if [[ $thirsty == false ]]; then 
    last_time="$[$(date +%s) + 10]" 
    thirsty=true 
    echo -n "${last_time} $(date +%s) ${thirsty}" 

    elif [[ $[last_time] -lt $(date +%s) ]]; then 
    echo -n " You're thirsty" 
    fi 

} 
+0

(実際には、 'echo -n'は実際には悪い形式です - ' 'echo'のPOSIX仕様(http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html)は、 '-n'は実装定義として提供されています。つまり、異なるシェルが' echo -n'で異なることができます。 ";上記のリンクのAPPLICATION USAGEセクションも参照してください)。 –

+0

質問に直接お答えください。**すべてのシェル変数は、明示的にフラグを立てない限り、グローバルです。これは明白な再生器を必要とするのはなぜですか?他の人がコピーして貼り付けて、変更を加えずに動作して自分自身の行動を見ることができます。 –

+0

私はこの関数を呼び出す別の関数 'spaceship_prompt'を持っています。そして、最後に私は 'PROMPT = '$(spaceship_prompt)'を持っています。 –

答えて

2

あなたのコードが実際にから呼び出されているので:

PROMPT='$(drink_water)' 

...それが含まれているすべてが(このコマンド置換操作の一部として生成されたサブプロセスで実行され$()は、「コマンド置換」であります:新しいサブプロセスを作成し、そのサブプロセスに与えられたコードを実行し、サブプロセスの出力を読み込みます)。そのサブプロセスが終了すると、サブプロセス内で行われた変数(グローバル変数さえ)の変更は失われます。

precmdファンクション内に直接更新コードを挿入すると、各プロンプトが表示される前にコマンドが置換される前に実行されます。それは次のとおりです。もちろん

precmd() { 
    local curr_time=$(date +%s) # this is slow, don't repeat it! 
    if [[ $thirsty = false ]]; then 
    last_time="$((curr_time + 10))" 
    thirsty=true 
    PROMPT="$last_time $curr_time $thirsty" 
    elif ((last_time < curr_time)); then 
    PROMPT=" You're thirsty" 
    fi 
} 

彼らが持続している場合、あなたはコマンド置換を使用してプロンプトを設定することができますが、変数の状態にの更新は別々に行われなければなら、置換コマンド外

+0

これはうまくいくようですが、他のいくつかの関数を使って ' PROMPT'を実行すると、これらの関数の出力に 'PROMPT 'をどのように設定するのですか?この関数は明示的に 'PROMPT'に出力を追加します。 –

+0

これは、この質問の対象外です。 –

+0

しかし、あなたの意見を別々の関数に分割することをお勧めします。つまり、メイン・シェルから呼び出す1つの関数で更新を行い、コマンド置換で呼び出す別の関数から表示する文字列を生成します。 **しかし、**、そのアドバイスは、 "それは価値がある、フォローアップを楽しまない"という基準で提供されます - これをカメレオンの質問にする努力(http://meta.stackexchange.com/questions/ 43478/exit-strategies-for-chameleon-questions)が怒られます。 –

関連する問題