如何从 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
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