[英]Prevent 'cp' from outputting the file name from a bash script
我有一个Shell脚本,它将一些文件复制到当前目录,对其进行压缩,然后将压缩后的文件流式传输到stdout。
在客户端,我使用plink执行脚本并将stdin流传输到文件。
这几乎可行。
从脚本内部执行时,似乎cp命令输出正在复制的文件名。 如果我执行' cp / path / to / file1。 '在外壳上安静地执行; 如果我在脚本中执行它,则会输出“ file1”。
我该如何预防? 我试过将cp命令的输出传递到/ dev / null和虚拟文本文件,但是没有运气。
谢谢你的帮助。
#!/bin/bash
cp /path/to/file1 .
cp /path/to/file2 .
cp /path/to/file3 .
tar -cvzf package.tgz file1 file2 file3
cat package.tgz
file1
file2
file3
<<binary data>>
不是cp,而是tar。 您将其传递给-v,这将使其打印文件名。
啊哈! 我一直以为tar发出的文件名将转到stderr
,但并非总是如此:仅当您将tar文件写入stdout
, -v
编写的文件才转到stderr
:
$ tar cvf - share > /dev/null
share/ # this must be going
share/.DS_Store # to stderr since we
share/man/ # redirected stdout to
share/man/.DS_Store # /dev/null above.
share/man/man1/
share/man/man1/diffmerge.man1
反例:
$ tar cvf blah.tar share > /dev/null
这没有产生文件名列表,因为它们被发送到/dev/null
。 我想你每天都学到新东西。 :-)
正如其他人指出的那样,tar的-v(详细)选项会将文件名踢出到STDERR。 您还可以通过让tar将压缩文件流写入STDOUT来提高脚本的效率:
tar zcf - file1 file2 file3
在此示例中,作为文件名传递的“-”选项使tar将输出写入STDOUT。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.