【问题标题】:Using Linux Wildcard character in Perl Script在 Perl 脚本中使用 Linux 通配符
【发布时间】:2017-08-27 03:31:08
【问题描述】:

我有两个文件。

~/directory1/7120599_S1.txt

hello world!

~/directory2/7120599_S7.txt

bye world!

我正在寻找将7120599_S1.txt 的内容附加到7120599_S7.txt 末尾的Perl 代码。以下命令适用于 Linux:

$ cat ~/directory1/7120599_S1.txt >> ~/directory2/7120599_S*.txt

新建~/directory2/7120599_S7.txt

hello world!
bye world!

但由于某种原因,这在 Perl 中不起作用

system "cat ~/directory1/7120599_S1.txt >> ~/directory2/7120599_S*.txt"

相反,它会在 directory2 中创建一个名为 7120599_S*.txt 的新文件。如何让 Perl 识别 Linux 通配符?

【问题讨论】:

  • 你用的是什么外壳? echo $SHELL确定 ~/directory2/7120599_S7.txt 已经存在了吗?
  • @Schwern 当我输入echo $SHELL 时,我得到了/bin/bash。我想我正在使用 BASH shell。 ~/directory2/7120599_S7.txt 存在

标签: linux perl append


【解决方案1】:

如果我们查看POSIX shell

对于其他重定向操作符,重定向操作符后面的单词应进行波浪号扩展、参数扩展、命令替换、算术扩展和引号删除。非交互式外壳不应对单词执行路径名扩展;一个交互式 shell 可以执行它,但只有在扩展会产生一个单词时才会这样做。

路径名扩展是指像*.txt 这样的全局变量。

Bash shell 并没有精确地遵循 POSIX,而是试图更加方便和明智,包括即使在非交互模式下也将路径名扩展应用于重定向目标。通常,您的交互式 shell 将是 Bash。

但是,当您运行system 命令时,这通常会运行一个更简单的符合 POSIX 标准的 shell(尽管这完全取决于您的操作系统)。这个 shell 通常安装为/bin/sh

如果你想要 Bash,你必须显式运行 Bash,例如

system "bash", "-c", "cat ~/directory1/7120599_S1.txt >> ~/directory2/7120599_S*.txt"

顺便说一句,如果你设置了POSIXLY_CORRECT 环境变量,你可以强制 Bash 遵循 POSIX。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-05
    • 1970-01-01
    • 2014-06-26
    • 2012-06-29
    • 2012-05-26
    • 2013-11-22
    • 1970-01-01
    相关资源
    最近更新 更多