在Perl脚本中使用Linux通配符

coo*_*490 2 linux perl append

我有两个文件.

〜/ directory1中/ 7120599_S1.txt

hello world!
Run Code Online (Sandbox Code Playgroud)

〜/ directory2/7120599_S7.txt

bye world!
Run Code Online (Sandbox Code Playgroud)

我在寻找的Perl代码,将内容添加7120599_S1.txt到年底7120599_S7.txt.以下命令适用于Linux:

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

新〜/ directory2/7120599_S7.txt

hello world!
bye world!
Run Code Online (Sandbox Code Playgroud)

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

system "cat ~/directory1/7120599_S1.txt >> ~/directory2/7120599_S*.txt"
Run Code Online (Sandbox Code Playgroud)

相反,它会在directory2被调用时创建一个新文件7120599_S*.txt.如何让Perl识别Linux通配符?

amo*_*mon 6

如果我们看一下POSIX shell:

对于其他重定向运算符,重定向运算符后面的单词应进行波形扩展,参数扩展,命令替换,算术扩展和引用删除.不得通过非交互式shell对单词执行路径名扩展; 交互式shell可以执行它,但只有当扩展会产生一个单词时才会这样做.

路径名扩展指的是globs *.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"
Run Code Online (Sandbox Code Playgroud)

顺便说一下,如果设置POSIXLY_CORRECT环境变量,可以强制Bash跟随POSIX .