ブロックの中では単純には set できないので lambda を使ったり capture を使ったり入っていないかもしれない ruby コマンドは使わずに printenv を使ったり工夫した。
config/deploy.rb
set :tmp_dir, -> {
tmpdir = nil
on roles(:all) do
tmpdir = capture('printenv TMPDIR || printenv TMP || printenv TEMP || echo /tmp').chomp
end
tmpdir
}