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/