【问题标题】:What does exec ${PERL-perl} -Sx $0 ${1+"$@"} mean in Shell script?exec ${PERL-perl} -Sx $0 ${1+"$@"} 在Shell脚本中是什么意思?
【发布时间】:2019-03-18 00:31:31
【问题描述】:

我的任务是将包含 Shell 脚本、Perl 代码的 Shell 脚本转换为 Python。

我设法将 Perl 代码转换为 Python。

但是有这个shell脚本语句我没看懂。

#! /usr/bin/sh
exec ${PERL-perl} -Sx $0 ${1+"$@"}
#! /opt/tools/perl5/bin/perl
Some Perl code which I converted to Python

第二行是什么意思?

我知道$0 将被评估为脚本名称。

我假设${PERL-perl} 将评估机器上安装的任何 Perl 解释器(如果我错了请纠正我,也请让我知道如何为 Python 提及类似的事情)。

有人能解释一下exec 命令中剩余的参数是做什么的吗?

【问题讨论】:

  • 脚本在执行时会做什么?如果您没有运行脚本来比较结果,如何验证您是否正确转换了代码?
  • man bashperlrun
  • 如何在 shell 脚本中运行 Python 解释器而不是 Perl。在exec 命令之后有没有类似${PYTHON-python} 的内容?
  • 在阅读了一些关于perl-S-x 选项之后,如果将脚本转换为Python,您确定保留这些行有意义吗?这实际上是关于启动一个 Perl 脚本,而你已经摆脱了它。你不能用#!/usr/bin/env python3或类似的东西替换前三行吗?

标签: python python-3.x shell perl scripting


【解决方案1】:

${PERL-perl}parameter expansion:如果未设置PERL shell 变量,则使用perl,否则使用PERL 的内容。 (可以说,这应该是${PERL:-perl},因为如果PERL 设置为空,则将使用空字符串。)

${1+"$@"} 代表“如果设置了$1,则使用"$@"(所有位置参数),否则替换为null”。如果没有位置参数并扩展为单个参数而不是根本没有参数,则这是对 "$@" 混淆的旧 shell 的一个技巧。 Bash 可以只使用 "$@"

有关perl 的选项,请参阅perldoc perlrun

【讨论】:

  • 好的。感谢那。 -Sx 是什么意思?文档说-S 检查文件是否为套接字,-x 检查文件是否可执行。一个文件怎么可能两者兼有?
  • @Baelish2285 Perl 命令行选项记录在 here。你在看别的东西。
  • 还是不明白第二行参数是解释为shell脚本选项还是perl选项?我需要考虑哪些文件?
  • @Baelish2285 整行是一个 shell 命令,但 perl 采用 Perl 特定的命令行选项。
  • @Baelish2285, ...就像你运行ls -l; -l 的相关含义记录在ls 的手册中,而不是外壳本身。同样,对于perl -Sxperl 的手册会告诉您-S-x 在这种情况下的含义。
猜你喜欢
  • 2010-12-28
  • 2011-01-22
  • 2023-03-25
  • 2015-05-29
  • 2010-11-05
  • 2018-03-05
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多