如何在bash脚本中嵌入和运行存储在bash变量中的多行perl脚本(不立即运行perl)

时间:2020-02-09 17:35:26

标签: bash shell perl embed

如何用存储在bash变量中的运行this perl script的东西替换[RUN_ABOVE_PERL_SORTING_SCRIPT_HERE]

#!/usr/bin/env bash

# The perl script to sort getfacl output:
# https://github.com/philips/acl/blob/master/test/sort-getfacl-output

find /etc -name .git -prune -o -print | xargs getfacl -peL | [RUN_ABOVE_PERL_SORTING_SCRIPT_HERE] > /etc/.facl.nogit.txt

注意:

  1. 我不想使用2个文件(bash脚本和perl脚本)来解决此问题;我希望将功能全部存储在一个bash脚本文件中。
  2. 在存储perl-script变量时,我不想立即运行perl脚本,因为我想稍后在下面显示的getfacl(1) bash管道中运行它。
  3. 有许多类似的stackoverflow问题和答案,但我都找不到(有清晰的阅读代码吗?),它们都可以解决a)多行和b)延迟执行(或嵌入式perl脚本)问题的一部分。
  4. 并且需要澄清的是:这个问题并非专门针对getfacl(1),它只是探索如何将perl脚本以及可能的其他脚本语言(如python)嵌入到bash变量中以便在bash中延迟执行的催化剂。脚本。)

2 个答案:

答案 0 :(得分:2)

使用bash read command,它会将perl脚本读入一个变量,该变量稍后将在bash脚本中执行。

#!/usr/bin/env bash

# sort getfacl output: the following code is copied from:
# https://github.com/philips/acl/blob/master/test/sort-getfacl-output

read -r -d '' SCRIPT <<'EOS'
#!/usr/bin/env perl -w

undef $/;
print join("\n\n", sort split(/\n\n/, <>)), "\n\n";
EOS

find /etc -name .git -prune -o -print | xargs getfacl -peL | perl -e "$SCRIPT" > /etc/.facl.nogit.txt

答案 1 :(得分:1)

Run Perl Script From Unix Shell Script对此进行了说明。

在这里适用:

  1. 您可以使用-e / -E将代码传递给Perl。

    perl -e"$script"
    

    perl -e"$( curl "$url" )"
    
  2. 您可以通过STDIN传递代码。

    printf %s "$script" | perl -e"$script"
    

    curl "$url" | perl
    

    (这对您不起作用,因为您需要STDIN。)

  3. 您可以创建一个虚拟文件。

    perl <( printf %s "$script" )
    

    perl <( curl "$url" )
    
  4. 您可以利用perl的{​​{1}}选项。

    (如果要动态下载脚本,则不适用。)


以上所有条件均假定已执行以下命令:

-x

上面的某些假设已经执行了以下命令:

url='https://github.com/philips/acl/blob/master/test/sort-getfacl-output'
相关问题