在Perl脚本中使用Linux通配符

时间:2017-08-26 19:20:16

标签: linux perl append

我有两个文件。

〜/ 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通配符?

1 个答案:

答案 0 :(得分:6)

如果我们查看POSIX shell

  

对于其他重定向运算符,重定向运算符后面的单词应进行代码扩展,参数扩展,命令替换,算术扩展和引用删除。不得通过非交互式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。