【问题标题】:Passing filename arguments from Bash to Perl将文件名参数从 Bash 传递到 Perl
【发布时间】:2017-02-23 12:50:18
【问题描述】:

我正在完成我的大学作业,但我偶然发现了一个我自己无法解决的问题,也许这里有人可以提供帮助,因为我没有想法......

我必须将指定为参数列表的文件名传递给我的主脚本 (Bash),然后在另一个脚本 (Perl) 中处理这些文件。

这就是我在 Bash 中的做法:

perl DisplayGroupedByArtist.pl "$@"

然后在 perl 中我像这样遍历文件:

my @files = @ARGV;
foreach $file (@files)
{
  #some stuff here
}

问题是 - 只要我不从目录外部调用脚本,它就可以正常工作。

test/bash_script.sh Samples/*.mp3

然后,传递给我的 Perl 脚本的值只是“Samples/* .mp3"。

我想值得一提的是,在我的 Bash 脚本中,我有这一行来确保我从正确的目录调用 Perl 脚本:

cd "$(dirname "$0")"

更新: 说清楚:这里的主要问题是,如果我像 bash_script.sh *.mp3 这样运行脚本 - 它会将文件列表毫无问题地传递给 Perl 脚本,而如果我像 test/bash_script.sh *.mp3 那样执行它,则传递给 Perl 的值只是一个字符串“*.mp3”,而不是文件列表。

【问题讨论】:

  • 如果删除cd 行会怎样?
  • 如果我这样做了,那么“perl DisplayGroupedByArtist.pl”根本不起作用,返回“无法打开 perl 脚本“DisplayGroupedByArtist.pl”:没有这样的文件或目录”。
  • 修复脚本的路径,然后。 perl "$(dirname "$0")"/DisplayGroupedByArtist.pl "$@".
  • 不幸的是 - 不能解决问题。仍然是完全相同的行为。
  • 哪种行为?没有这样的文件或目录,或者没有找到文件?

标签: linux bash perl shell


【解决方案1】:

你必须调整论点; Samples/*.mp3 是相对于脚本的调用位置from,而不是脚本的位置。

tests/bash_script.sh ../Samples/*.mp3

【讨论】:

  • 问题是......我的老师希望脚本在两种情况下都能完全一样地工作:test/bash_script.sh *.mp3 和 cd test bash_script.sh *.mp3
  • 你确定吗?这是标准的 Unix 行为。您的老师可能会认为这是等效的。
  • 不幸的是我......他给我发了一条消息说他想像这样运行它:test/bash_script.sh *.mp3 并希望它列出测试目录中的 mp3 文件。
  • 然后您需要引用该模式并让您的 bash 脚本将其与正确的目录连接并展开它(坦率地说,这不是您可以安全地在 bash 中执行的操作),或将连接的目录/模式传递给 Perl 脚本(它确实具有扩展 glob 的功能)。 test/bash_script '*.mp3'.
  • 感谢您的回复。不过这里的主要问题是,如果我像bash_script.sh *.mp3 这样运行脚本 - 它会将文件列表毫无问题地传递给 Perl 脚本,而如果我像 test/bash_script.sh *.mp3 那样执行它,传递给 Perl 的值只是一个字符串“*.mp3”,不是文件列表。
【解决方案2】:

这不是 Perl 的问题,而是调用 shell 的问题。假设您的 shell 是 bash(但请注意,您的老师的 shell 可能有所不同),通配符模式(例如 Samples/*.mp3)通常由 shell 扩展为文件列表;现在,如果没有文件与模式匹配,究竟会发生什么,取决于 shell 及其配置方式。例如,bash 中的默认值是表示模式的字符串原封不动地传递给应用程序,但也可以配置 shell,以便简单地删除模式,或者打印错误消息。

您不知道老师的 shell 是如何配置的,如果您的老师使用与 bash 不同的 shell,行为甚至可能不同。

当你定义一个程序的接口时,你永远不会指定“它是如何在调用 shell 中键入的”,因为这没有多大意义。您指定程序接受哪些参数(即 ARGV 的内容)以及这些参数如何影响程序的执行。调用者(您自己或老师)必须输入的内容才能让您的程序以正确的形式接收参数,这不是接口规范的一部分。

例如,您可以允许传递相对路径,并定义查找文件的搜索顺序。您还可以允许传递给您的命令的字符串包含通配符。您甚至可以允许正则表达式或您想到的其他内容,但永远不要忘记:您无法访问调用者实际输入的字符序列,因此您无法对它们进行任何解释。

【讨论】:

    猜你喜欢
    • 2017-12-05
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多