如何从 bash 执行动态生成的 perl 脚本?

How to execute dynamically generated perl script from bash?

1.问题:

我有一个 bash 脚本(到目前为止是一个 2 行)调用一个生成第二个 bash 脚本的 perl 脚本。我想要第一个 bash 脚本到 运行 perl 脚本并执行第二个(生成的)bash 脚本。

2。背景:

这个动态生成的 bash 脚本对 ubuntu bash(通过 wsl)和 windows 上的 cygwin bash(只要有只有一个 bash 命令):

$(perl -e 'print "ls -ltr"')

3。我尝试过的方法不起作用(第 1 部分):

以下尝试无效,因为 bash 不会将分号或我的换行符解释为新行并抱怨(例如)pwd 不是 ls 的选项。

$(perl -e 'print "ls -ltr;pwd") 
$(perl -e 'print "ls -ltr
pwd") 
$(perl -e 'print "ls -ltr \n pwd")

有没有办法让上面的这些例子起作用?我喜欢它,因为代码确实是一行代码,我不会为每个命令创建一个新的 shell。

4.我尝试过的方法不起作用(第 2 部分):

perl -e 'print `ls -ltr`; print  `pwd`'

实际上这确实有效,但我不喜欢这种方法,因为它很慢并且无法在生成的代码中使用 bash for 循环。它还排除了在 bash 脚本的开头创建和修改环境变量并在以后使用它们。

5.让 perl 将 bash 脚本写入文件可能有效吗?

那么让我的 perl 动态地将 bash 脚本写入一个(唯一且动态命名的)文件并让这个 perl 脚本将文件的名称打印到标准输出,以便第一个(调用)bash 可以存储临时文件名,使用“chmod +x”调用(执行)它,然后删除它。

有没有更简单的方法?看来我们应该能够使第 1 部分中的示例以某种方式工作。

谢谢

齐格弗里德

因此,动态生成 Bash 代码几乎不是一个好主意;编写适用于常见情况的代码生成逻辑太容易了,但在您没有想到的情况下却表现得很糟糕。 (这尤其正确,因为文件名可以包含奇怪的字符——空格、星号、反斜杠、换行符、引号、首字母连字符,随便你怎么命名——但即使你没有在代码生成逻辑中使用文件名,也有很多这可能会出错。)

但是如果你打算这样做,那么你执行代码的方式——你告诉 Bash 读取包含代码的字符串并将其传递给解释器的完整解析器链的方式; 和换行符等等 — 正在使用 eval:

eval "$(perl -e 'print "ls -ltr; pwd"')"

# the above is equivalent to
#    eval 'ls -ltr; pwd'
# which in turn is equivalent to
#    ls -ltr; pwd

或者,您可以使用 bash -c 调用 单独的 副本 Bash 到 运行 此命令:

bash -c "$(perl -e 'print "ls -ltr; pwd"')"

# the above is equivalent to
#    bash -c 'ls -ltr; pwd'
# which is roughly equivalent to
#    ls -ltr; pwd
# except that it runs in a separate shell