Как я могу защитить скобки, переданные команде CD?
Я спросил здесь, как сделать cd защитить пространства. Завершение вкладки - это хорошо, но иногда вы вставляете путь из буфера обмена, так что это полезно.
Однако решение разбивается скобками. Независимо от того, как вы пытаетесь избежать и защитить ввод, он всегда возвращает:
bash: syntax error near unexpected token `('
Есть ли способ, чтобы он также работал с круглыми скобками? То, что я хочу, это то, что, когда я вхожу в это, это работает:
cd My path with spaces (and parentheses)
2 ответа
Используйте одинарные кавычки ' вокруг спора. (Это работает для любой команды, а не только 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 для получения дополнительной информации.
Другой метод состоит в том, чтобы оболочка считывала отдельную строку текста вместо передачи аргумента в командной строке.
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)"'
Как правильно cd для каталогов с символами, такими как пробелы и скобки в их именах:
Если имя вашей папки не содержит символ одинарных кавычек 'Просто заключите его в одинарные кавычки:
cd 'My path with spaces (and parentheses)'
Если он включает в себя ', но не содержит двойной кавычки ", негативная реакция \обратная цитата ` или доллар $, заключите его в двойные кавычки:
cd "My path with spaces (and parentheses)"
Имя файла или каталога не очень часто содержит одинарные и двойные кавычки. (Возможно, это связано с тем, что в имени файла или каталога вообще не бывает двойных кавычек. Единственная причина, по которой я изначально не рекомендовал двойные кавычки, заключается в том, что, в отличие от одинарных кавычек, двойные кавычки позволяют $ расширить переменные среды. Это было бы проблемой, если бы ваше имя файла содержало $ символ сопровождается текстом.)
Если он содержит оба, или вы просто хотите другой метод, то вы можете избежать каждого пробела и скобок вручную, вставив символ обратной косой черты \ перед этим:
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 командам передается текст, напечатанный после них, в виде строки текста, и когда команде необходимо интерпретировать эту строку как последовательность отдельных аргументов (что как правило, но не всегда), код команды должен вызывать специальную библиотечную функцию, которая анализирует строку командной строки. (В программе на Си это происходит негласно, но все еще включает использование Windows API.)