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

18

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

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

bash: syntax error near unexpected token '('

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

cd My path with spaces (and parentheses)
    
задан Strapakowsky 30.03.2013 в 01:35
источник

2 ответа

17

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

cd 'My path with spaces (and parentheses)'

Вы не можете заставить bash передать круглые скобки на cd . Получение пространства для работы вообще - очень специализированный хак.

Одиночные кавычки работают вокруг каждого символа, кроме самого ' . Замените одиночные кавычки на 4-символьную последовательность '\'' .

cd 'Apostrophe'\''s a pain'

Это не работает, если имя каталога начинается с дефиса, потому что это вызывает команду cd для интерпретации аргумента как опции. Пропустите -- перед именем каталога, чтобы избежать этого.

См. Ссылка для более подробной информации.

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

[email protected] ~$ read -r; cd -- "$REPLY"
My path with spaces (and parentheses)
[email protected] ~/My path with spaces (and parentheses)$ 

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

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

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

alias cde='cd -- "$(xsel -bo)"'
    
ответ дан Gilles 30.03.2013 в 02:14
источник
6

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

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

cd 'My path with spaces (and parentheses)'

Если он содержит ' , но не содержит символ двойной кавычки " , обратный люк \ , backquote ' или доллар $ , заключите его в двойные кавычки:

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 не удастся или введите неправильную папку.

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

    [email protected]:~$ cd My path with spaces (and parentheses)
    bash: syntax error near unexpected token '('
    

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

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

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

    
ответ дан Eliah Kagan 30.03.2013 в 02:05