2016-08-01 57 views
0

我的名字是-q文件(它看起來像這樣由事故讓)貓`-q`文件(在Linux中) - 通過操作數,看起來像選項

我想看看它的內容,所以我想這些

$ cat '-q' 
$ cat "-q" 
$ cat $'-q' 

但毫無效果。(所有給出同樣的錯誤cat: invalid option -- 'q'

有沒有辦法看到它的內容?

+2

引號是在每個單一情況下,在* cat'可執行文件啓動之前由shell *刪除。因此,它不知道使用了什麼引號(如果有的話)。它們控制shell解析內容的方式,以及shell如何將一個字符串分解成一個參數列表 - 但是對於這裏給出的每一個單引號格式,被調用的系統調用是完全相同的:'execv(「/ usr/bin/cat」 ,{「cat」,「-q」,NUL})'或其等價物。 –

+2

'cat ./- q',順便說一句,會工作。 –

回答

2

創建一個名爲-q文件做

touch -- "-q" 

,並查看其內容

cat -- '-q' # Used single quotes to treat anything inside as literal characters 

應該這樣做。 --意味着接下來應該被視爲位置參數。


請花時間去看看@ RICI的[ answer ]這提醒有關單VS雙引號一些substle方面。

+0

夠搞笑的,這不起作用。我在我的系統上試了一下,得到了'> cat:\ -q:沒有這樣的文件或目錄。 –

+1

同樣的結果。也許'cat ./- q'? –

+0

'貓 - 「-q」'工作。無論如何'--'是一個關鍵!謝謝。 ('cat - 「\ -q」'也不適用於我。) – plhn

5

sjsam's helpful answer提供了可行的解決方案,但它是值得更深的挖掘

參數傳遞給Unix工具(如cat)可分爲兩個組(使用POSIX術語):

  • 選項(例如,-l;根據選項的定義,可能跟隨一個選項形式參數) - 開關修改實用程序的基本行爲

  • 操作數(例如,一個文件名) - ,該實用上操作數據。

POSIX requires all options, if any, to come before any operands,但GNU公用事業放寬這項規定,以允許交織爲了方便選項和操作。

無論哪種方式,-後跟一個字母或數字通常意味着選項

這樣才能讓路過操作數發生下手-是,特殊選項--可以用來告訴任何實用程序:對待任何後續參數作爲操作數,即使他們像選項。


由於在這種情況操作數-q看起來像一個選項,與前述--它把它標記爲一個操作數是必須的。

至於如何傳遞字符串-q本身作爲參數:

  • -q包含沒有元字符,所以殼傳遞給它原樣cat - 沒有引用需要的。

  • 引用('-q'"-q"$'-q'\-q確實在這種情況下沒有危害,但絕對沒有影響這裏,因爲shell - 應用了任何擴展後 - 只需刪除任何引號字符(一個叫做quote removal的過程),然後把這個詞傳遞給cat(因爲Charles Duffy在這個問題上的註釋)。