mirror of
https://git.savannah.gnu.org/git/parallel.git
synced 2024-11-25 23:47:53 +00:00
parallel: Implemented --shellquote
This commit is contained in:
parent
795c0fa3bd
commit
c48c5fb7b9
|
@ -7,6 +7,11 @@ niceload --start-condition
|
||||||
|
|
||||||
Til QUOTING:
|
Til QUOTING:
|
||||||
|
|
||||||
|
cat <<'_EOF' | parallel -v echo
|
||||||
|
awk -v FS="\",\"" '{print $1, $3, $4, $5, $9, $14}' | grep -v "#" | sed -e '1d' -e 's/\"//g' -e 's/\/\/\//\t/g' | cut -f1-6,11 | sed -e 's/\/\//\t/g' -e 's/ /\t/g
|
||||||
|
_EOF
|
||||||
|
|
||||||
|
|
||||||
FN="two spaces"
|
FN="two spaces"
|
||||||
echo 1 | parallel -q echo {} "$FN"
|
echo 1 | parallel -q echo {} "$FN"
|
||||||
# Prints 2 spaces between 'two' and 'spaces'
|
# Prints 2 spaces between 'two' and 'spaces'
|
||||||
|
|
16
src/parallel
16
src/parallel
|
@ -397,6 +397,7 @@ sub options_hash {
|
||||||
"number-of-cpus" => \$::opt_number_of_cpus,
|
"number-of-cpus" => \$::opt_number_of_cpus,
|
||||||
"number-of-cores" => \$::opt_number_of_cores,
|
"number-of-cores" => \$::opt_number_of_cores,
|
||||||
"use-cpus-instead-of-cores" => \$::opt_use_cpus_instead_of_cores,
|
"use-cpus-instead-of-cores" => \$::opt_use_cpus_instead_of_cores,
|
||||||
|
"shellquote|shell_quote|shell-quote" => \$::opt_shellquote,
|
||||||
"nice=i" => \$::opt_nice,
|
"nice=i" => \$::opt_nice,
|
||||||
"timeout=i" => \$::opt_timeout,
|
"timeout=i" => \$::opt_timeout,
|
||||||
"onall" => \$::opt_onall,
|
"onall" => \$::opt_onall,
|
||||||
|
@ -841,7 +842,7 @@ sub __QUOTING_ARGUMENTS_FOR_SHELL__ {}
|
||||||
sub shell_quote {
|
sub shell_quote {
|
||||||
my @strings = (@_);
|
my @strings = (@_);
|
||||||
for my $a (@strings) {
|
for my $a (@strings) {
|
||||||
$a =~ s/([\002-\011\013-\032\\\#\?\`\(\)\*\>\<\~\|\; \"\!\$\&\'])/\\$1/g;
|
$a =~ s/([\002-\011\013-\032\\\#\?\`\(\)\{\}\*\>\<\~\|\; \"\!\$\&\'])/\\$1/g;
|
||||||
$a =~ s/[\n]/'\n'/g; # filenames with '\n' is quoted using \'
|
$a =~ s/[\n]/'\n'/g; # filenames with '\n' is quoted using \'
|
||||||
}
|
}
|
||||||
return wantarray ? @strings : "@strings";
|
return wantarray ? @strings : "@strings";
|
||||||
|
@ -852,7 +853,7 @@ sub shell_quote_scalar {
|
||||||
# Returns:
|
# Returns:
|
||||||
# string quoted with \ as needed by the shell
|
# string quoted with \ as needed by the shell
|
||||||
my $a = shift;
|
my $a = shift;
|
||||||
$a =~ s/([\002-\011\013-\032\\\#\?\`\(\)\*\>\<\~\|\; \"\!\$\&\'])/\\$1/g;
|
$a =~ s/([\002-\011\013-\032\\\#\?\`\(\)\{\}\*\>\<\~\|\; \"\!\$\&\'])/\\$1/g;
|
||||||
$a =~ s/[\n]/'\n'/g; # filenames with '\n' is quoted using \'
|
$a =~ s/[\n]/'\n'/g; # filenames with '\n' is quoted using \'
|
||||||
return $a;
|
return $a;
|
||||||
}
|
}
|
||||||
|
@ -3701,6 +3702,11 @@ sub len {
|
||||||
# Worse than worst case: every char needs to be quoted with \
|
# Worse than worst case: every char needs to be quoted with \
|
||||||
$len *= 2;
|
$len *= 2;
|
||||||
}
|
}
|
||||||
|
if($::opt_nice) {
|
||||||
|
# Pessimistic length if --shellquote is set
|
||||||
|
# Worse than worst case: every char needs to be quoted with \ twice
|
||||||
|
$len *= 4;
|
||||||
|
}
|
||||||
return $len;
|
return $len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3795,6 +3801,12 @@ sub replaced {
|
||||||
$self->{'replaced'} = "nice -n" . $::opt_nice
|
$self->{'replaced'} = "nice -n" . $::opt_nice
|
||||||
. " bash -c " . ::shell_quote_scalar($self->{'replaced'});
|
. " bash -c " . ::shell_quote_scalar($self->{'replaced'});
|
||||||
}
|
}
|
||||||
|
if($::opt_shellquote) {
|
||||||
|
# Prepend echo
|
||||||
|
# and quote twice
|
||||||
|
$self->{'replaced'} = "echo " .
|
||||||
|
::shell_quote_scalar(::shell_quote_scalar($self->{'replaced'}));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if($::oodebug and length($self->{'replaced'}) != ($self->len())) {
|
if($::oodebug and length($self->{'replaced'}) != ($self->len())) {
|
||||||
::my_dump($self);
|
::my_dump($self);
|
||||||
|
|
|
@ -879,6 +879,8 @@ default.
|
||||||
|
|
||||||
If the stdin (standard input) only contains whitespace, do not run the command.
|
If the stdin (standard input) only contains whitespace, do not run the command.
|
||||||
|
|
||||||
|
If used with B<--pipe> this is slow.
|
||||||
|
|
||||||
|
|
||||||
=item B<--recstart> I<startstring>
|
=item B<--recstart> I<startstring>
|
||||||
|
|
||||||
|
@ -1036,6 +1038,12 @@ Use the replacement string I<replace-str> instead of B<{#}> for
|
||||||
job sequence number.
|
job sequence number.
|
||||||
|
|
||||||
|
|
||||||
|
=item B<--shellquote>
|
||||||
|
|
||||||
|
Quote input as would be needed by the shell. Useful for making quoting
|
||||||
|
composed commands for GNU B<parallel>.
|
||||||
|
|
||||||
|
|
||||||
=item B<--skip-first-line>
|
=item B<--skip-first-line>
|
||||||
|
|
||||||
Do not use the first line of input (used by GNU B<parallel> itself
|
Do not use the first line of input (used by GNU B<parallel> itself
|
||||||
|
|
|
@ -5,3 +5,8 @@ cat <<'EOF' | sed -e s/\$SERVER1/$SERVER1/\;s/\$SERVER2/$SERVER2/ | parallel -j1
|
||||||
echo '### Test --timeout';
|
echo '### Test --timeout';
|
||||||
parallel -j0 -k --timeout 1 echo {}\; sleep {}\; echo {} ::: 1.1 2.2 3.3 4.4
|
parallel -j0 -k --timeout 1 echo {}\; sleep {}\; echo {} ::: 1.1 2.2 3.3 4.4
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
|
echo '### Test --shellquote'
|
||||||
|
cat <<'_EOF' | parallel --shellquote
|
||||||
|
awk -v FS="\",\"" '{print $1, $3, $4, $5, $9, $14}' | grep -v "#" | sed -e '1d' -e 's/\"//g' -e 's/\/\/\//\t/g' | cut -f1-6,11 | sed -e 's/\/\//\t/g' -e 's/ /\t/g
|
||||||
|
_EOF
|
||||||
|
|
|
@ -4,3 +4,5 @@
|
||||||
2.2
|
2.2
|
||||||
3.3
|
3.3
|
||||||
4.4
|
4.4
|
||||||
|
### Test --shellquote
|
||||||
|
awk\ -v\ FS=\"\\\",\\\"\"\ \'\{print\ \$1,\ \$3,\ \$4,\ \$5,\ \$9,\ \$14\}\'\ \|\ grep\ -v\ \"\#\"\ \|\ sed\ -e\ \'1d\'\ -e\ \'s/\\\"//g\'\ -e\ \'s/\\/\\/\\//\\t/g\'\ \|\ cut\ -f1-6,11\ \|\ sed\ -e\ \'s/\\/\\//\\t/g\'\ -e\ \'s/\ /\\t/g
|
||||||
|
|
Loading…
Reference in a new issue