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

(Вопрос поставлен «не в терминале» только после того, как я опубликовал его, однако он по-прежнему является релевантным ответом и полезен для людей, особенно в отношении точки evince, которая является графическим приложением) [ ! d0]

Вы можете извлекать отдельные изображения из программы чтения PDF evince, просто щелкнув и перетащив их на рабочий стол; иногда вам нужно щелкнуть более одного раза, но он обычно работает, и я нашел его действительно полезным! Кроме того, если вы щелкните правой кнопкой мыши изображение в pdf, вы можете сохранить его в другом формате изображения, а не по умолчанию .png.

Чтобы извлечь все изображения из pdf, вы можете использовать pdfimages, что часть poppler-utils и находится в репозитории, хотя вы, вероятно, все равно его установили. В этом пакете также есть ряд других инструментов. Чтобы извлечь изображения в jpg (и собственный формат программы, ppm), просто введите pdfimages -j name.pdf <picture name>. Назовите имя изображения, которое вы хотите, и изображения будут последовательно помечены как dog1.jpg и т. Д. Очевидно, вы можете указать абсолютные местоположения, если хотите, с pdfimages -j ~/KeyGuides/TSENG.PDF ~/Scripts/DOG (где DOG не является каталогом, но имя, которое будут использовать изображения ).

Pdfimages - довольно простая программа, но я увижу, могу ли я найти какие-либо другие инструменты, так как я тоже много манипулирую изображениями / pdf.

1
задан 13 April 2017 в 15:32

1 ответ

Как правильно 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"'
[d13 ] Обратные косые черты не являются специальными внутри одинарных кавычек, поэтому мы завершаем строку с одним кавычком, добавляем одинарную цитату с защитой от обратного слэша и сразу начинаем другую строку с одним кавычком, без всякого пространства, которое могло бы начать отдельный аргумент. [!d13 ]

Почему вы, вероятно, не можете заставить cd работать так, как вы этого хотели:

Что касается работы cd My path with spaces (and parentheses): нет, вы действительно не можете этого сделать, потому что это поведение не является конкретным к команде cd, это часть того, как работает любая команда. Когда команда запускается, она предоставляет список аргументов, предоставленных пользователем. Когда оболочка видит пробел, он знает, что один аргумент только что закончился, а другой только что начался. Чтобы передать пробел как часть аргумента, он должен быть указан одним из указанных способов.

Вы могли бы достичь сделать это за вас этого времени - вы может заставить cd My path with spaces работать в папку My path with spaces. Это можно сделать, написав сценарий оболочки, который объединяет все предоставленные пользователем аргументы пробелами. (Тогда, если бы вы захотели, вы могли бы сделать cd сам называть этот скрипт, создав для него псевдоним оболочки с именем cd, который будет иметь приоритет над встроенной оболочкой cd, которую вы сейчас обычно запускаете.) Но: [ ! d16] Сценарий не получит разные аргументы для 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
ответ дан 25 May 2018 в 00:01
  • 1
    Не может ли все это решить с помощью функции, которая анализирует мою команду, цитирует строку после cd, а затем передает ее на | sh? Это должно быть выполнимо, но я застрял в том, что все, что я пытаюсь интерпретировать, исчезает с кавычками. – Strapakowsky 30 March 2013 в 08:50
  • 2
    @Strapakowsky Можете ли вы предоставить более подробную информацию о том, что вы сделали до сих пор? Сейчас я не понимаю, почему этот метод не будет подвергаться всем ограничениям, которые я подробно описал в своем ответе, что предотвратит сценарий оболочки ( или a функцию, или псевдоним) от возможности разобрать всю командную строку сразу. – Eliah Kagan 30 March 2013 в 21:07

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

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