Shell

file $(ls /usr/bin/* | grep zip) 命令給了我錯誤。怎麼了?

  • August 25, 2018

我決定讀一本關於 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會出錯!

關於您正在做的事情有幾處是多餘的。我知道您正在嘗試學習一個構造,但讓我們分解一下您剛剛完成的一些部分以及如何完成它。

  1. ls /usr/bin列出bin目錄中的文件就足夠了,你根本不需要星號。
  2. 你根本不應該解析輸出ls,它是模棱兩可的並且有潛在的危險。
  3. 你可以在沒有 grep 的情況下得到相同的效果ls /usr/bin/*zip*,但是ls仍然是多餘的,你可以將 glob 擴展傳遞給文件:file /usr/bin/*zip*

最後,find通常是查找文件的更好工具。你可以像這樣做你所追求的:

$ find /usr/bin -iname '*zip*' -exec file {} +

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