mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-01 17:35:17 +00: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(34, "hello\n", "echo --str hello");
|
||||||
DO_TEST(35, "hello\n", "echo --hi");
|
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
|
# undef DO_TEST
|
||||||
|
|
||||||
VIR_FREE(custom_uri);
|
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
|
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>
|
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
|
which is a single shell argument consisting of multiple I<COMMAND> actions
|
||||||
and their arguments joined with whitespace, and separated by semicolons
|
and their arguments joined with whitespace and separated by semicolons or
|
||||||
between commands. Within I<COMMAND_STRING>, virsh understands the
|
newlines between commands. Within I<COMMAND_STRING>, virsh understands the
|
||||||
same single, double, and backslash escapes as the shell, although you must
|
same single, double, and backslash escapes as the shell, although you must
|
||||||
add another layer of shell escaping in creating the single shell argument.
|
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
|
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
|
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>
|
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
|
which is a single shell argument consisting of multiple I<COMMAND> actions
|
||||||
and their arguments joined with whitespace, and separated by semicolons
|
and their arguments joined with whitespace and separated by semicolons or
|
||||||
between commands. Within I<COMMAND_STRING>, virt-admin understands the
|
newlines between commands. Within I<COMMAND_STRING>, virt-admin understands the
|
||||||
same single, double, and backslash escapes as the shell, although you must
|
same single, double, and backslash escapes as the shell, although you must
|
||||||
add another layer of shell escaping in creating the single shell argument.
|
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
|
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')
|
if (*p == '\0')
|
||||||
return VSH_TK_END;
|
return VSH_TK_END;
|
||||||
if (*p == ';') {
|
if (*p == ';' || *p == '\n') {
|
||||||
parser->pos = ++p; /* = \0 or begin of next command */
|
parser->pos = ++p; /* = \0 or begin of next command */
|
||||||
return VSH_TK_SUBCMD_END;
|
return VSH_TK_SUBCMD_END;
|
||||||
}
|
}
|
||||||
@ -1672,7 +1672,7 @@ vshCommandStringGetArg(vshControl *ctl, vshCommandParser *parser, char **res,
|
|||||||
while (*p) {
|
while (*p) {
|
||||||
/* end of token is blank space or ';' */
|
/* end of token is blank space or ';' */
|
||||||
if (!double_quote && !single_quote &&
|
if (!double_quote && !single_quote &&
|
||||||
(*p == ' ' || *p == '\t' || *p == ';'))
|
(*p == ' ' || *p == '\t' || *p == ';' || *p == '\n'))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (!double_quote && *p == '\'') { /* single quote */
|
if (!double_quote && *p == '\'') { /* single quote */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user