【问题标题】:How to execute dynamically generated perl script from bash?如何从 bash 执行动态生成的 perl 脚本?
【发布时间】:2022-01-05 22:45:06
【问题描述】:

1.问题:

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

2。背景:

这个动态生成的 bash 脚本在 windows 上对 ubuntu bash(通过 wsl)和 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 部分中的示例工作。

谢谢

齐格飞

【问题讨论】:

  • perl -e ... | bash

标签: bash perl


【解决方案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

【讨论】:

  • 评估适用于 ubuntu bash 和 cygwin bash!我无法让“bash -c”执行这两个命令。谢谢!
  • @user3477493 你是否在$( ) 部分加上了双引号?没有它们,eval 版本在某些情况下会异常失败,bash -c 版本几乎永远无法正常工作。
  • 是的,正如我所说,eval 效果很好,我正在使用它。我只是无法让“bash - c”与双引号一起使用......
  • @user3477493:这很奇怪。普通的bash -c "ls -ltr; pwd" 适合你吗?
  • 是的...现在一切正常包括 bash -c "$(perl -e 'print "ls -ltr; pwd"')""... 抱歉...我本来可以一个错字或(更可能因为我尝试了几次)通过重新启动修复的问题。它现在适用于 wsl2/ubuntu bash 和 cygwin bash。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-02
相关资源
最近更新 更多