mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 17:34:18 +03:00
virsh: Treat \n like ; in batch mode
I wanted to do a demonstration with virsh batch mode, which takes multiple commands all packed into a single argument: $ virsh -c test:///default 'echo a; echo b;' a b but that produced a really long line, so I tried to make it more legible: $ virsh -c test:///default ' echo a; echo b; ' error: unknown command: ' ' Let's be more like the shell, and treat unquoted newline as a command separator just as we do for semicolon. In fact, with that, I can even now mix styles: $ virsh -c test:///default ' echo a; echo b echo c ' a b c Signed-off-by: Eric Blake <eblake@redhat.com> Reviewed-by: John Ferlan <jferlan@redhat.com>
This commit is contained in:
parent
12a5e10f02
commit
fe1b683fd0
@ -411,6 +411,10 @@ mymain(void)
|
||||
DO_TEST(34, "hello\n", "echo --str hello");
|
||||
DO_TEST(35, "hello\n", "echo --hi");
|
||||
|
||||
/* Tests of multiple commands. */
|
||||
DO_TEST(36, "a\nb\n", " echo a; echo b;");
|
||||
DO_TEST(37, "a\nb\n", "\necho a\n echo b\n");
|
||||
|
||||
# undef DO_TEST
|
||||
|
||||
VIR_FREE(custom_uri);
|
||||
|
@ -40,8 +40,8 @@ as a name.
|
||||
The B<virsh> program can be used either to run one I<COMMAND> by giving the
|
||||
command and its arguments on the shell command line, or a I<COMMAND_STRING>
|
||||
which is a single shell argument consisting of multiple I<COMMAND> actions
|
||||
and their arguments joined with whitespace, and separated by semicolons
|
||||
between commands. Within I<COMMAND_STRING>, virsh understands the
|
||||
and their arguments joined with whitespace and separated by semicolons or
|
||||
newlines between commands. Within I<COMMAND_STRING>, virsh understands the
|
||||
same single, double, and backslash escapes as the shell, although you must
|
||||
add another layer of shell escaping in creating the single shell argument.
|
||||
If no command is given in the command line, B<virsh> will then start a minimal
|
||||
|
@ -23,8 +23,8 @@ Where I<command> is one of the commands listed below.
|
||||
The B<virt-admin> program can be used either to run one I<COMMAND> by giving the
|
||||
command and its arguments on the shell command line, or a I<COMMAND_STRING>
|
||||
which is a single shell argument consisting of multiple I<COMMAND> actions
|
||||
and their arguments joined with whitespace, and separated by semicolons
|
||||
between commands. Within I<COMMAND_STRING>, virt-admin understands the
|
||||
and their arguments joined with whitespace and separated by semicolons or
|
||||
newlines between commands. Within I<COMMAND_STRING>, virt-admin understands the
|
||||
same single, double, and backslash escapes as the shell, although you must
|
||||
add another layer of shell escaping in creating the single shell argument.
|
||||
If no command is given in the command line, B<virt-admin> will then start a minimal
|
||||
|
@ -1664,7 +1664,7 @@ vshCommandStringGetArg(vshControl *ctl, vshCommandParser *parser, char **res,
|
||||
|
||||
if (*p == '\0')
|
||||
return VSH_TK_END;
|
||||
if (*p == ';') {
|
||||
if (*p == ';' || *p == '\n') {
|
||||
parser->pos = ++p; /* = \0 or begin of next command */
|
||||
return VSH_TK_SUBCMD_END;
|
||||
}
|
||||
@ -1672,7 +1672,7 @@ vshCommandStringGetArg(vshControl *ctl, vshCommandParser *parser, char **res,
|
||||
while (*p) {
|
||||
/* end of token is blank space or ';' */
|
||||
if (!double_quote && !single_quote &&
|
||||
(*p == ' ' || *p == '\t' || *p == ';'))
|
||||
(*p == ' ' || *p == '\t' || *p == ';' || *p == '\n'))
|
||||
break;
|
||||
|
||||
if (!double_quote && *p == '\'') { /* single quote */
|
||||
|
Loading…
Reference in New Issue
Block a user