Shell-Script

shell’test’命令中的’-size +0’是什麼意思

  • March 1, 2016

我遇到了if這樣的聲明:

if [ -f <file path> -size +0 ]

我知道-f存在文件檢查,但這-size +0在這裡有什麼作用?

我無法從手冊頁中獲得幫助,也嘗試搜尋論壇,有點好奇地想找到這對我有幫助。

這是沒有意義的。

ksh93如果一元運算符的參數過多並且一元運算符以 開頭,則這種處理方式-將選擇第二個作為參數,其餘的將被忽略:

$ ksh -c '[ -f a.out foo bar ] && echo yes'
yes
$ ksh -c '[ -e a.out foo a ] && echo yes'
yes

(除非第二個參數是-a/-o,否則不會被忽略)

檢查ksh93test的來源確認該行為。

也在做strace

$ { strace -p "$$" & sleep 1; [ -f a.out -size +0 ]; kill "$!"; }
[1] 18467
Process 18455 attached
restart_syscall(<... resuming interrupted call ...>) = 0
stat(".", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("a.out", {st_mode=S_IFREG|0755, st_size=8320, ...}) = 0
kill(18467, SIGTERMProcess 18455 detached
<detached ...>

其他類似 Bourne 的 shell 將報告這種情況下的錯誤。POSIX 未指定該行為。


如果要檢查文件是否存在且大小大於 0,則標準 shell 具有-s測試運算符:

[ -s file ] && echo 'file exist and size greater than 0'

ksh88也表現相同。使用我的 Solaris 10 VM:

$ ksh -c '[ -f a.out foo bar ] && echo yes'
yes
$ strings /usr/bin/ksh | grep -i version
@(#)Version M-11/16/88i

Pre-POSIX shell 也有類似的行為,包括 Solaris 10 中的 Bourne shell、傳家寶 Bourne shell、Schily osh 和 Schily sh。

這很可能是錯誤的。該表單-size +0對於標準實用程序是合法的find(並且意味著非空文件),但對於test(aka [) 是不合法的。似乎腳本作者在沒有保留適當上下文的情況下重用了它。如果是ksh,則應進行以下檢查:

–s file
   True, if file exists and has size greater than zero.

或者,此腳本適用於(我不知道的)擴展 shell,它test是內部的,並且針對這種複雜的結構進行了擴展。(您的 ksh 是特定的擴展版本嗎?)

引用自:https://unix.stackexchange.com/questions/266666