我有两个文件。
〜/ 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通配符?
答案 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。