Как защитить скобки, переданные команде cd? [дублировать]

Я спросил здесь, как заставить cd защитить пробелы. Завершение вкладки отлично, но иногда вы вставляете путь из буфера обмена, поэтому это полезно.

Однако решение разрывается со скобками. Независимо от того, как вы пытаетесь избежать и защитить входные данные, они всегда возвращаются:

bash: syntax error near unexpected token `('

Есть ли какой-то способ, чтобы он также имел дело со скобками? Я хочу, чтобы, когда я вхожу в это, это работало:

cd My path with spaces (and parentheses)
21
задан 13 April 2017 в 15:32

2 ответа

Используйте одинарные кавычки ' вокруг аргумента. (Это работает на любую команду, не всего cd).

cd 'My path with spaces (and parentheses)'

Вы не можете заставить удар передать круглые скобки 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 для получения дополнительной информации.

Другой метод должен иметь оболочку, читает отдельную строку текста вместо того, чтобы передать аргумент командной строке.

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

, А не вставка копии вручную, Вы могли бы также сделать это программно. Установите или xclip или xsel.

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

Вы могли бы сделать это псевдонимом.

alias cde='cd -- "$(xsel -bo)"'
23
ответ дан 13 April 2017 в 15:32

Как к правильно cd к каталогам с символами как пробелы и круглые скобки на их имена:

Если Ваше имя папки не включает символ одинарной кавычки ', просто включите его в одинарные кавычки:

cd 'My path with spaces (and parentheses)'

Если это действительно включает a ', но не включает символ двойной кавычки ", обратная реакция \, одинарная левая кавычка ` или доллар $, включите его в двойные кавычки:

cd "My path with spaces (and parentheses)"

Имени файла или каталога не очень свойственно содержать и одинарные и двойные кавычки. (Это происходит, возможно, из-за того, как имени файла или каталога не свойственно содержать двойные кавычки вообще. Единственная причина, которую я не рекомендовал двойным кавычкам первоначально, состоит в том, что, в отличие от одинарных кавычек, двойные кавычки позволяют $ развернуть переменные среды. Это было бы проблемой, если бы Ваше имя файла содержало a $ символ сопровождается текстом.)

Если это содержит обоих, или Вы просто хотите другой метод, то можно выйти из каждого пространства и круглой скобки вручную путем вставки символа обратной косой черты \ перед ним:

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

Это является раздражающим, но к счастью, оболочка с делает это для Вас, если Вы вводите начало имени и нажимаете 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 команда, это - часть способа выполнить любые работы команды. Когда команда выполняется, это, дают список аргументов, обеспеченных пользователем. Когда оболочка видит пространство, она знает, что один аргумент только что закончился, и другой только что начал. Для передачи пространства как части аргумента, это должно быть заключено в кавычки одним из вышеупомянутых способов.

Вы могли достигнуть части этого часть времени - Вы могли сделать cd My path with spaces работа для входа My path with spaces папка. Вы могли достигнуть этого путем записи сценария оболочки, который связывает все его обеспеченные пользователями споры с пробелами. (Затем, если бы Вы хотели Вас, то мог бы сделать cd самостоятельно назовите тот сценарий путем создания названного псевдонима оболочки cd для него; это имело бы приоритет по встроенной оболочке cd который Вы в настоящее время обычно выполняете.), Но:

  • Сценарий не получил бы различные аргументы в пользу My path with spaces и My path with spaces, так cd My path with spaces привел бы к сбою или ввел бы неправильную папку.

  • Вы не могли сделать этого для круглых скобок, потому что они используются для группировки оболочкой, таким образом, что они не передаются всегда к команде. На самом деле большую часть времени оболочка просто бросит синтаксическую ошибку (как Вы видели):

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

    Независимо от того, что Вы изменяете, та синтаксическая ошибка продолжит происходить, когда та команда будет дана.

Я говорю, что Вы, "вероятно", не можете сделать эту работу, потому что существует один путь, который будет - можно сделать собственную оболочку, которая ведет себя, как Вы желаете. Но это чрезвычайно трудно, и маловероятно, что любой хотел бы сделать это, только внести это изменение. (Вы могли также изменить исходный код существующей оболочки, которая является более практическим решением, но все еще требует большего усилия, чем большинство людей хотело бы проявить.) Помимо этого, это маловероятно это cd может признать, что имена каталогов с произвольными символами включая пробелы в них, как он делает в Windows.

В случае, если Вы задаетесь вопросом, почему это работает над Windows, но не в Ubuntu: В Windows команды передаются текст, введенный после них как строка текста, и когда команда должна интерпретировать ту строку как последовательность отдельных аргументов (который это обычно, но не всегда, делает), код для команды должен назвать специальную библиотечную функцию, которая анализирует строку командной строки. (В программе C это происходит негласно, но все еще включает использование Windows API.)

6
ответ дан 13 April 2017 в 15:32

Другие вопросы по тегам:

Похожие вопросы: