如何保護傳遞給 cd 指令的括號?

如何保護傳遞給 cd 指令的括號?

我問這裡如何製作cd保護空間。製表符補全功能很棒,但有時您會從剪貼簿貼上路徑,因此這很有用。

然而,該解決方案以括號分隔。無論您如何嘗試轉義和保護輸入,它總是返回:

bash: syntax error near unexpected token `('

有沒有辦法讓它也處理括號?我想要的是,當我輸入這個時,它會起作用:

cd My path with spaces (and parentheses)

答案1

'在參數兩邊使用單引號。 (這適用於任何命令,而不僅僅是cd)。

cd 'My path with spaces (and parentheses)'

你不能讓 bash 將括號傳遞給cd.讓空間發揮作用是一項非常專業的技巧。

單引號適用於除'自身之外的每個字元。將單引號替換為 4 字元序列'\''

cd 'Apostrophe'\''s a pain'

如果目錄名稱以連字符開頭,則此方法不起作用,因為這會導致cd命令將參數解釋為選項。--在目錄名稱之前傳遞以避免這種情況。

https://unix.stackexchange.com/questions/69144/how-do-i-escape-a-sub-directory-name-with-an-ampersand-in-it/69147#69147更多細節。

另一種方法是讓 shell 讀取單獨的文字行,而不是在命令列上傳遞參數。

Strapakowsky@darkstar ~$ read -r; cd -- "$REPLY"
My path with spaces (and parentheses)
Strapakowsky@darkstar ~/My path with spaces (and parentheses)$ 

您不妨以程式設計方式進行操作,而不是手動複製貼上。安裝任一剪輯或者謝爾

cd -- "$(xclip -o -selection clipboard)"
cd -- "$(xsel -bo)"

您可以將其設為別名。

alias cde='cd -- "$(xsel -bo)"'

答案2

如何正確cd存取名稱中包含空格和括號等字元的目錄:

如果您的資料夾名稱不包含單引號字符',只需將其括在單引號中:

cd 'My path with spaces (and parentheses)'

如果它包含 a ',但不包含雙引號字元"、反斜線\、反引號`或美元$,請將其括在雙引號中:

cd "My path with spaces (and parentheses)"

檔案名稱或目錄名稱同時包含單引號和雙引號的情況並不常見。 (這可能是因為文件或目錄名包含雙引號並不常見。我最初不推薦使用雙引號的唯一原因是,與單引號不同,雙引號允許$擴展環境變量。如果您的文件名包含$字符後跟文本,這將是一個問題。

如果它包含兩者,或者您只是想要另一種方法,那麼您可以透過在其前面插入反斜線字元來手動轉義每個空格和括號\

cd My\ path\ with\ spaces\ \(and parentheses\)

這很煩人,但幸運的是,shell 帶有為你而做,如果您鍵入名稱的開頭並按Tab。如果有多個以 開頭的檔案或目錄名My,那麼您可能需要輸入更多內容才能使其展開。如果按下後Tab它沒有展開,您可以Tab再次按下以查看與您目前輸入的內容相符的文件清單。然後您就知道還需要輸入多少內容才能使其唯一匹配並擴展。

或者,您可以轉義內部引號。例如,假設您有一個名為:

Mischa's gardening tips for "home and office"

您可以使用:

cd Mischa\'s\ gardening\ tips\ for\ \"home\ and\ office\"

但您也可以簡單使用:

cd 'Mischa'\''s gardening tips for "home and office"'

反斜線在單引號內並不特殊,因此我們終止單引號字串,附加一個反斜線保護的單引號,並立即開始另一個單引號字串,所有這些都沒有任何可以開始單獨參數的空格。

為什麼你可能無法cd按照你想要的方式工作:

至於開始cd My path with spaces (and parentheses)工作:不,你真的不能這樣做,因為這種行為不是特定於cd命令的,它是運行任何命令的工作方式的一部分。執行指令時,會給予使用者提供的參數清單。當 shell 看到一個空格時,它知道一個爭論剛剛結束,另一個爭論才剛開始。要傳遞空格作為參數的一部分,必須以上述方式之一引用它。

你可以實現部分這個的一些的時間 - 你可以讓cd My path with spaces工作進入My path with spaces資料夾。您可以透過編寫 shell 腳本來實現此目的,該腳本將所有使用者提供的參數與空格連接起來。 (然後,如果您願意,您可以cd透過建立為其命名的 shell 別名來使自己呼叫該腳本cd;這將優先於cd您目前通常運行的內建 shell。)但是:

  • 該腳本不會收到My path with spaces和的不同參數My path with spaces,因此cd My path with spaces會失敗或進入錯誤的資料夾。

  • 您不能對括號執行此操作,因為這些括號用於由 shell 進行分組,因此它們不會以任何方式傳遞給命令。實際上,大多數時候 shell 只會拋出一個語法錯誤(正如您所看到的):

    ek@Kip:~$ cd My path with spaces (and parentheses)
    bash: syntax error near unexpected token `('
    

    無論您進行什麼更改,給出該命令時該語法錯誤都會繼續發生。

我說你「可能」無法完成這項工作,因為有一種方法可以做到這一點——你可以製作自己的外殼,使其行為如你所願。但這是極其困難的,而且不太可能有人願意這樣做,只是為了做出這種改變。 (您也可以修改現有 shell 的源代碼,這是一個更實用的解決方案,但仍然需要比大多數人想要付出的更多努力。)除此之外,不太可能cd接受包含任意字元(包括空格)的目錄名稱,就像在 Windows 上一樣。

如果您想知道為什麼這在 Windows 上有效但在 Ubuntu 上無效:在 Windows 中,命令將在命令後面鍵入的文字作為文字字串,並且當命令需要將該字串解釋為一系列單獨的參數時(通常但並非總是如此),該命令的程式碼必須呼叫一個特殊的函式庫函數來解析命令列字串。 (在 C 程式中,這發生在幕後,但仍涉及使用 Windows API。)

相關內容