2

以下のような zsh でループを実行すると、出力に空白行が表示されます (このループの自明性は無視してください。これは単なる例です。より現実的な例はmysql -s -e "show databases;"、データベースごとに実行して何かを実行している可能性があります)。

for foo in $(cat test.txt); do
    echo $foo
done



alpha
bravo
charlie
delta

この例では、test.txthas が 4 行の場合、3 行の空白行が表示されます。5 行ある場合は、4 つの空白行が表示されます。MySql の例では、MySql データベースよりも空白行が 1 行少なくなります。

これらの空白行の原因は何ですか?どうすれば回避できますか? Bash で同じスクリプトを実行しても、空白行は表示されません。


編集:理由はまだわかりませんが、Oh My Zshが原因のようです。でコメントアウトするsource $ZSH/oh-my-zsh.sh.zshrc、空白行が表示されなくなります。

4

2 に答える 2

3

そうです、 ~/.oh-my-zsh が原因です。~/.oh-my-zsh/lib/termsupport.zsh に入ります

#Appears at the beginning of (and during) of command execution
function omz_termsupport_preexec {
  emulate -L zsh
  setopt extended_glob
  local CMD=${1[(wr)^(*=*|sudo|ssh|rake|-*)]} #cmd name only, or if this is sudo or ssh, the next cmd
  local LINE="${2:gs/$/\\$}"
  LINE="${LINE:gs/%/%%}"
  title "$CMD" "%100>...>$LINE%<<"
}

コマンドの後に続くものを含むコマンド全体にタイトルを設定しようとしていることがわかります。sudo などのプレフィックスを削除し、$ や % などの文字をエスケープします。しかし、何らかの理由で、cat を実行すると改行が挿入されます。簡単な修正のために、次のようにタイトルを $CMD に設定するだけで、oh-my-zsh を少し手こずっています。

#Appears at the beginning of (and during) of command execution
function omz_termsupport_preexec {
  emulate -L zsh
  setopt extended_glob
  local CMD=${1[(wr)^(*=*|sudo|ssh|rake|-*)]} #cmd name only, or if this is sudo or ssh, the next cmd
  ## Removing command argument parsing because of cat bug
  #local LINE="${2:gs/$/\\$}"
  #LINE="${LINE:gs/%/%%}"
  #title "$CMD" "%100>...>$LINE%<<"
  title "$CMD" 
}

oh-my-zsh の github にあるこのファイルの最近の履歴をさかのぼりましたが、このバグはしばらくの間存在していたようです。「正しい」答えは、おそらく $LINE の周りにネストされた展開を行い、空白と改行を削除し、oh-my-zsh にプル リクエストを行うことです。しかし、私の zsh foo はこれにはまだ弱すぎます。

于 2013-09-24T23:55:07.750 に答える
-1

私は、Bash がどういうわけか空白を完全に除外していると思います。これを簡単に修正するには、grep を少し実行します。

例:

for foo in $(grep -v '^$' test.txt); do
    # The quotes are recommended to make sure you shell won't do weird things with the variables
    echo "$foo"
done
于 2013-05-28T13:24:17.817 に答える