Shell-Script
shell’test’命令中的’-size +0’是什麼意思
我遇到了
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
,否則不會被忽略)檢查ksh93
test
的來源確認該行為。也在做
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 是特定的擴展版本嗎?)