これ:
$ echo $VAR
something
これ:
$ [[ -z "$VAR" ]]
$ echo $?
1
しかし、これは:
if [[ -z "$TMUX_MAN_PANE" ]]; then
echo 'NEVER PRINTS!'
これは私の頭を壊した。
修正する
以下は実際のコードです。私はそれを動作させることはできません。
tmux_man_page() {
if [[ "$TERM" =~ 'screen' ]] && [[ -n "$TMUX" ]]; then
tmux list-panes -t $TMUX_MAN_PANE &> /dev/null
echo $?
echo $TMUX_MAN_PANE
[[ -z "$TMUX_MAN_PANE" ]]
echo $?
if ! [[ -z "$TMUX_MAN_PANE" ]] && [[ $? ]]; then
echo luck
tmux -q respawn-pane -k -t $TMUX_MAN_PANE man $1
else
echo fuck
tmux split-window -vf man $1
TMUX_MAN_PANE=$(tmux display-message -p "#{pane_id}")
export TMUX_MAN_PANE
tmux select-pane -t {last}
fi
fi
}
アップデート2:成功
ついに調べました。 if文の最初の行の状態を取得する際に問題があります。 ifステートメントの最初の行からtmuxステートメントの出力を取得するには、いくつかのトリックを実行する必要があります。これを行うためのよりきれいな方法を知っている人がいるなら、誰もが耳を傾けます。
作業コードは次のとおりです。
tmux_man_page() {
if [[ "$TERM" =~ 'screen' ]] && [[ -n "$TMUX" ]]; then
fucker=$(tmux list-panes -t $TMUX_MAN_PANE 2>&1)
if ! [[ -z "$TMUX_MAN_PANE" ]] && ! [[ $fucker =~ 'find pane' ]]; then
tmux -q respawn-pane -k -t $TMUX_MAN_PANE man $1
else
tmux split-window -vf man $1
TMUX_MAN_PANE=$(tmux display-message -p "#{pane_id}")
export TMUX_MAN_PANE
tmux select-pane -t {last}
fi
fi
}
tmux_man_page_close() {
if [ $TMUX_MAN_PANE ]; then
tmux kill-pane -t $TMUX_MAN_PANE
fi
}
答え1
鍵は、これが0
真を意味し1
(またはゼロ以外の値)、偽を意味することです。
シェルで真であるテスト(または正常に完了したプログラム)は、コード0で終了します。テストは空の場合は[[ -z "$VAR" ]]
コード0(true)を返し$VAR
、空でない場合はコード1(false)を返します。
$ var=""; [[ -z "$var" ]]; echo $?
0
$ var="NOT EMPTY"; [[ -z "$var" ]]; echo $?
1
要約すると、$VAR
null以外の場合は[[ -z "$VAR" ]]
false(returns 1
)で、then
ステートメントは実行されません。
変数がnullでない場合は、テストでtrueを返すようにしますか?その場合は、-z
次のように置き換えてください-n
。
$ var=""; [[ -n "$var" ]]; echo $?
1
$ var="NOT EMPTY"; [[ -n "$var" ]]; echo $?
0
-n
簡潔にするために省略されても同じテストが実行されます。
$ var=""; [[ "$var" ]]; echo $?
1
$ var="NOT EMPTY"; [[ "$var" ]]; echo $?
0