如果 bash 的一行中存在文件,我将运行命令。
这是我现在正在做的事情:
$ stat /last_dump.sql && mysql -D my_database < last_dump.sql
这是正确的做法吗?
工作正常,但是输出了统计报告
File: '/last_db.sql'
Size: 42161 Blocks: 88 IO Block: 4096 regular file
Device: 26h/38d Inode: 108 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ me) Gid: ( 0/ me)
Access: 2016-06-08 08:07:15.886741191 +0000
Modify: 2016-06-08 08:07:06.218593606 +0000
Change: 2016-06-08 08:07:06.218593606 +0000
Birth: -
我怎么能够不是显示此统计报告?
答案1
您还可以使用文件测试运算符:
[[ -e ./last_dump.sql ]] && mysql -D my_database < ./last_dump.sql
有关这些运算符的更多信息,请参见此处:文件测试操作员
但如果您喜欢使用,stat
可以将其输出转移到/dev/null
:
stat ./last_dump.sql >/dev/null && mysql -D my_database < ./last_dump.sql
请注意./
上面的命令中的意思是当前目录。另外我应该注意,如果您想让 stat 完全静默(即使出现错误),/dev/null
也可以使用&>/dev/null
or >/dev/null 2>&1
(具有相同的结果)将错误转移到。
答案2
调用stat
仅在获取无法从基本 shell 命令获取的信息时有用,例如文件的修改时间或权限。要测试文件是否存在,请使用该test
命令,也拼写为[
.该命令内置于大多数 shell 中。
if [ -e last_dump.sql ]; then mysql -D my_database < last_dump.sql; fi
test 测试-e
指定文件是否存在;该文件可以是任何类型,包括损坏的符号链接。如果您只需要常规文件(包括常规文件的符号链接),请改用-f
。
出于多种原因,使用[ … ]
优于:stat
- 调用
stat
只是丢弃其输出是测试文件是否存在的一种混淆方式。想想将要阅读代码的人(例如六个月后的您):[ -e file ]
简单地说“file
存在吗?”,而调用则stat
说“给我文件的元数据”,而测试是否存在只是一个副作用。 [ … ]
是一个标准命令,但stat
并非在所有 Unix 变体上都存在,并且存在不兼容的命令行选项。在这种特定情况下,情况并没有那么糟糕,因为您没有使用任何命令行选项。stat
由于它是外部命令,因此速度较慢。
&&
当你的意思是“如果”时,你也应该避免使用。这也明显可读性较差。它也不太健壮,因为在set -e
(如果任何程序中断则告诉 shell 退出),如果不存在则[ -e last_dump.sql ] && mysql …
中止脚本,而继续运行。last_dump.sql
if [ -e last_dump.sql ]; then …; fi