Shell
file $(ls /usr/bin/* | grep zip) 命令給了我錯誤。怎麼了?
我決定讀一本關於 Linux/Unix 的書。我已經到了一章,他們試圖解釋如何將命令的輸出作為擴展傳遞給 shell。
以下命令
file $(ls /usr/bin/* | grep zip)
給我錯誤“無法打開”文件名(沒有這樣的文件或目錄)“。相反,當我這樣做時
file $(ls | grep zip)
無論文件夾如何,一切都正常顯示。為什麼?這是某種參數限制嗎?
如果我這樣做
file $(ls Pictures/ | grep jpg)
我得到以下資訊:
1234.jpg: ERROR: cannot open 1234.jpg (No such file or directory)
在我要列出的目錄中向右移動時
nassosdim@ubuntu:~$ cd Pictures/
nassosdim@ubuntu:~/Pictures$ file $(ls | grep jpg)
列印出文件的結果
1234.jpg: JPEG image data, JFIF standard 1.01
有人可以向我解釋發生了什麼嗎?:(
錯誤即將到來,因為 bash 正在嘗試
*
使用 glob 模式匹配將參數中的 ls 擴展為 ls 。當 glob 與模式不匹配時,它總是會出現這樣的錯誤。然後作為一個真正的星號*
傳遞給ls
它,它也不匹配文件,所以ls
會出錯!關於您正在做的事情有幾處是多餘的。我知道您正在嘗試學習一個構造,但讓我們分解一下您剛剛完成的一些部分以及如何完成它。
ls /usr/bin
列出bin目錄中的文件就足夠了,你根本不需要星號。- 你根本不應該解析輸出
ls
,它是模棱兩可的並且有潛在的危險。- 你可以在沒有 grep 的情況下得到相同的效果
ls /usr/bin/*zip*
,但是ls
仍然是多餘的,你可以將 glob 擴展傳遞給文件:file /usr/bin/*zip*
最後,
find
通常是查找文件的更好工具。你可以像這樣做你所追求的:$ find /usr/bin -iname '*zip*' -exec file {} +