あいつの日誌β

働きながら旅しています。

Mac で zsh 使ってる時に date コマンドのフォーマット化で悩んだ件

追伸

原因判明

あらすじ

日付をフォーマット指定して扱いたいんだけどうなくいかない...

% date +%Y-%m-%d
invalid directive

help が無いみたいだけどとりあえず usage は以下の通り

% date --help
option -- -
usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... 
            [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]

man date する

% man date
DATE(1)                   BSD General Commands Manual                  DATE(1)

NAME
     date -- display or set date and time

SYNOPSIS
     date [-ju] [-r seconds] [-v [+|-]val[ymwdHMS]] ... [+output_fmt]
     date [-jnu] [[[mm]dd]HH]MM[[cc]yy][.ss]
     date [-jnu] -f input_fmt new_date [+output_fmt]
     date [-d dst] [-t minutes_west]
...

で以下の記述を発見

EXAMPLES
     The command:

           date "+DATE: %Y-%m-%d%nTIME: %H:%M:%S"

     will display:

           DATE: 1987-11-21
           TIME: 13:36:16

やってみる

% date "+DATE: %Y-%m-%d%nTIME: %H:%M:%S"
preexec:printf:4: %Y: invalid directive

なんだろう...

bash にしたら動く

私は zsh 使うのですが一度 bash にしてから実行すれば動く

% bash                                                                                   
$ bash -c 'date +"%Y%m%d%H%M"'
201601301556

bash で実行したら上手くいきそうでいかない...

$ exit
% bash -c 'date +"%Y%m%d%H%M"'
preexec:printf:4: %Y: invalid directive

うーん。zsh の preexec が何かやってるっぽい。

% echo "%Y%m%d%H%M"
preexec:printf:4: %Y: invalid directive

date 関係無いなあ。

解決(?)

とりあえずファイルに保存したらちゃんと動くのでまあいいや。

% cat test.sh
date +"%Y%m%d%H%M"
% sh test.sh
201601301614

解決

カスタマイズしていた zshenv が原因でした。 私は作業している窓をわかりやすくする為にタイトルをつける以下のような処理を記述していました。

#for screen hard status
case "${TERM}" in
kterm*|xterm*)
    precmd() {
        printf "\e]0;${USER}@${HOST%%.*}:${PWD}\a"
    }   
    ;;  
screen*|ansi*)
    preexec() {
        local -a cmd; cmd=(${(z)2})
        if test $cmd[2]; then
            printf "\ek!$1\e\\"
        fi  
    }   
    precmd() {
        printf "\ek$(basename $(pwd))\e\\"
    }   
    ;;  
esac

たぶんこれはどこからかコピペしたんだと思いますが(覚えていない)、preexec() で printf が実行される段階で % が含まれているとそのようなフォーマートは知らないと怒られていました。

なのでこうしました。

s/printf/print -Pn/