1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
|
" Test for the shell related options ('shell', 'shellcmdflag', 'shellpipe',
" 'shellquote', 'shellredir', 'shellxescape', and 'shellxquote')
source check.vim
source shared.vim
func Test_shell_options()
" For each shell, the following options are checked:
" 'shellcmdflag', 'shellpipe', 'shellquote', 'shellredir', 'shellxescape',
" 'shellxquote'
let shells = []
if has('unix')
let shells += [['sh', '-c', '2>&1| tee', '', '>%s 2>&1', '', ''],
\ ['ksh', '-c', '2>&1| tee', '', '>%s 2>&1', '', ''],
\ ['mksh', '-c', '2>&1| tee', '', '>%s 2>&1', '', ''],
\ ['zsh', '-c', '2>&1| tee', '', '>%s 2>&1', '', ''],
\ ['zsh-beta', '-c', '2>&1| tee', '', '>%s 2>&1', '', ''],
\ ['bash', '-c', '2>&1| tee', '', '>%s 2>&1', '', ''],
\ ['fish', '-c', '2>&1| tee', '', '>%s 2>&1', '', ''],
\ ['ash', '-c', '2>&1| tee', '', '>%s 2>&1', '', ''],
\ ['dash', '-c', '2>&1| tee', '', '>%s 2>&1', '', ''],
\ ['csh', '-c', '|& tee', '', '>&', '', ''],
\ ['tcsh', '-c', '|& tee', '', '>&', '', '']]
endif
if has('win32')
let shells += [['cmd', '/c', '>%s 2>&1', '', '>%s 2>&1', '"&|<>()@^', ''],
\ ['cmd.exe', '/c', '>%s 2>&1', '', '>%s 2>&1', '"&|<>()@^', '('],
\ ['powershell.exe', '-c', '>', '', '>', '"&|<>()@^', '"'],
\ ['powershell', '-c', '>', '', '>', '"&|<>()@^', '"'],
\ ['sh.exe', '-c', '>%s 2>&1', '', '>%s 2>&1', '"&|<>()@^', '"'],
\ ['ksh.exe', '-c', '>%s 2>&1', '', '>%s 2>&1', '"&|<>()@^', '"'],
\ ['mksh.exe', '-c', '>%s 2>&1', '', '>%s 2>&1', '"&|<>()@^', '"'],
\ ['pdksh.exe', '-c', '>%s 2>&1', '', '>%s 2>&1', '"&|<>()@^', '"'],
\ ['zsh.exe', '-c', '>%s 2>&1', '', '>%s 2>&1', '"&|<>()@^', '"'],
\ ['zsh-beta.exe', '-c', '>%s 2>&1', '', '>%s 2>&1', '"&|<>()@^', '"'],
\ ['bash.exe', '-c', '>%s 2>&1', '', '>%s 2>&1', '"&|<>()@^', '"'],
\ ['dash.exe', '-c', '>%s 2>&1', '', '>%s 2>&1', '"&|<>()@^', '"'],
\ ['csh.exe', '-c', '>&', '', '>&', '"&|<>()@^', '"'],
\ ['tcsh.exe', '-c', '>&', '', '>&', '"&|<>()@^', '"']]
endif
let after =<< trim END
let l = [&shell, &shellcmdflag, &shellpipe, &shellquote]
let l += [&shellredir, &shellxescape, &shellxquote]
call writefile([json_encode(l)], 'Xtestout')
qall!
END
for e in shells
if RunVim([], after, '--cmd "set shell=' .. e[0] .. '"')
call assert_equal(e, json_decode(readfile('Xtestout')[0]))
endif
endfor
for e in shells
exe 'set shell=' .. e[0]
if e[0] =~# '.*csh$' || e[0] =~# '.*csh.exe$'
let str1 = "'cmd \"arg1\" '\\''arg2'\\'' \\!%#'"
let str2 = "'cmd \"arg1\" '\\''arg2'\\'' \\\\!\\%\\#'"
else
let str1 = "'cmd \"arg1\" '\\''arg2'\\'' !%#'"
let str2 = "'cmd \"arg1\" '\\''arg2'\\'' \\!\\%\\#'"
endif
call assert_equal(str1, shellescape("cmd \"arg1\" 'arg2' !%#"), e[0])
call assert_equal(str2, shellescape("cmd \"arg1\" 'arg2' !%#", 1), e[0])
endfor
set shell&
call delete('Xtestout')
endfunc
" Test for the 'shell' option
func Test_shell()
throw 'Skipped: Nvim missing :shell currently'
CheckUnix
let save_shell = &shell
set shell=
let caught_e91 = 0
try
shell
catch /E91:/
let caught_e91 = 1
endtry
call assert_equal(1, caught_e91)
let &shell = save_shell
endfunc
" Test for the 'shellquote' option
func Test_shellquote()
CheckUnix
set shellquote=#
set verbose=20
redir => v
silent! !echo Hello
redir END
set verbose&
set shellquote&
call assert_match(': "#echo Hello#"', v)
endfunc
func Test_shellescape()
let save_shell = &shell
set shell=bash
call assert_equal("'text'", shellescape('text'))
call assert_equal("'te\"xt'", 'te"xt'->shellescape())
call assert_equal("'te'\\''xt'", shellescape("te'xt"))
call assert_equal("'te%xt'", shellescape("te%xt"))
call assert_equal("'te\\%xt'", shellescape("te%xt", 1))
call assert_equal("'te#xt'", shellescape("te#xt"))
call assert_equal("'te\\#xt'", shellescape("te#xt", 1))
call assert_equal("'te!xt'", shellescape("te!xt"))
call assert_equal("'te\\!xt'", shellescape("te!xt", 1))
call assert_equal("'te\nxt'", shellescape("te\nxt"))
call assert_equal("'te\\\nxt'", shellescape("te\nxt", 1))
set shell=tcsh
call assert_equal("'te\\!xt'", shellescape("te!xt"))
call assert_equal("'te\\\\!xt'", shellescape("te!xt", 1))
call assert_equal("'te\\\nxt'", shellescape("te\nxt"))
call assert_equal("'te\\\\\nxt'", shellescape("te\nxt", 1))
let &shell = save_shell
endfunc
" Test for 'shellxquote'
func Test_shellxquote()
CheckUnix
let save_shell = &shell
let save_sxq = &shellxquote
let save_sxe = &shellxescape
call writefile(['#!/bin/sh', 'echo "Cmd: [$*]" > Xlog'], 'Xtestshell')
call setfperm('Xtestshell', "r-x------")
set shell=./Xtestshell
set shellxquote=\\"
call feedkeys(":!pwd\<CR>\<CR>", 'xt')
call assert_equal(['Cmd: [-c "pwd"]'], readfile('Xlog'))
set shellxquote=(
call feedkeys(":!pwd\<CR>\<CR>", 'xt')
call assert_equal(['Cmd: [-c (pwd)]'], readfile('Xlog'))
set shellxquote=\\"(
call feedkeys(":!pwd\<CR>\<CR>", 'xt')
call assert_equal(['Cmd: [-c "(pwd)"]'], readfile('Xlog'))
set shellxescape=\"&<<()@^
set shellxquote=(
call feedkeys(":!pwd\"&<<{}@^\<CR>\<CR>", 'xt')
call assert_equal(['Cmd: [-c (pwd^"^&^<^<{}^@^^)]'], readfile('Xlog'))
let &shell = save_shell
let &shellxquote = save_sxq
let &shellxescape = save_sxe
call delete('Xtestshell')
call delete('Xlog')
endfunc
" vim: shiftwidth=2 sts=2 expandtab
|