你如何让GNU Parallel解析带引号的命令行参数?

3

这是GNU并行文档中的一个示例程序,可通过shell脚本shebang执行。


#!/usr/bin/parallel  --shebang-wrap --colsep " " /bin/bash
echo Arguments: $@

的输出

./bash_echo.parl gracias 'buenos dias'

gracias
buenos 
dias

以上脚本无法处理被引号引用且包含空格的命令行参数。参数会被展开并视为单独的输入。

如何才能像下面的bash脚本一样获得正确的输出呢?

#!/usr/bin/env bash
for i in "$@"; do
  echo "$i"
done

显然,这个处理引用的命令行参数。

输出:

gracias
buenos dias

我尝试使用选项“colseps”将分隔符设置为“ ”,但这不是解决方案。


我的唯一想法是 ./script "$(printf "%q " gracias 'buenos dias')"... - KamilCuk
嗯...我似乎忘记了这个解决方法。但是,我不是Bash高手。 - Linus Fernandes
1个回答

2
你发现了一个bug:--shebang-wrap从未测试过带有空格的情况。
可能的解决方法:
diff --git a/src/parallel b/src/parallel
index 69adfdac..e7c0d930 100755
--- a/src/parallel
+++ b/src/parallel
@@ -3302,9 +3302,10 @@ sub read_options() {
                @options = shift @ARGV;
            }
            my $script = Q(shift @ARGV);
+           my @args = map{ Q($_) } @ARGV;
            # exec myself to split $ARGV[0] into separate fields
-           exec "$0 --_pipe-means-argfiles @options @parser $script ".
-               "::: @ARGV";
+            exec "$0 --_pipe-means-argfiles @options @parser $script ".
+                "::: @args";
        }
     }
     if($ARGV[0] =~ / --shebang(-?wrap)? /) {

这似乎可以解决你的问题,但也可能会引入其他问题。

有关更新:请关注https://savannah.gnu.org/bugs/index.php?63703


你的回归测试和健全性测试不应该覆盖任何这样的情况吗? - Linus Fernandes
@fernal73 是的,当这个问题被解决时,它将会被测试覆盖。如果修复不会引入其他错误,它将会成为20230222版本测试套件的一部分。 - Ole Tange

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接