Я не могу удалить файл:
sudo rm /usr/local/bin/Katy Perry - Dark Horse (Official) ft. Juicy J-0KSOMA3QBU0.mp4.part
Это показывает ошибку:
bash: syntax error near unexpected token `('
Как зафиксировать его?
Если у Вас только есть один файл в /usr/local/bin
чье имя запускается с Katy
, можно просто ввести
sudo rm /usr/local/bin/Katy
еще не нажимая Enter. Затем нажмите Tab для завершения команды к:
sudo rm Katy\ Perry\ -\ Dark\ Horse\ \(Official\)\ ft.\ Juicy\ J-0KSOMA3QBU0.mp4.part
(И затем нажмите Enter для выполнения его.)
Это заключает каждый символ в кавычки индивидуально (как в ответе AliNa) и делает так автоматически, таким образом, Вы ничего не пропускаете.
На практике большой объем заключения в кавычки, которое мы делаем на командной строке, на самом деле достигается автоматически с заполнением клавишей Tab.
Обратите внимание также, что заполнение клавишей Tab не ограничено ситуациями, где что-то должно было бы быть заключено в кавычки. Например, UUID как 8d44cd38-2158-42f4-9af1-94cd3ccbb9a8
не должен быть заключен в кавычки, но если это - единственная возможность, запускающаяся с 8
(или с некоторой более длинной начальной надлежащей подпоследовательностью), заполнение клавишей Tab могло быть очень удобным для создания команды, содержащей его.
Можно также вручную заключить в кавычки, в этом случае Вы захотите знать о других способах заключить в кавычки, чем \
, для случаев как этот, где много символов должны быть заключены в кавычки и ошибки легко сделать.
'
Если Вы хотите, чтобы выражение появилось буквально, и выражение не содержит одинарную кавычку characater ('
), хорошая привычка войти состоит в том, чтобы заключить его в кавычки с помощью одинарных кавычек.
sudo rm '/usr/local/bin/Katy Perry - Dark Horse (Official) ft. Juicy J-0KSOMA3QBU0.mp4.part'
Можно заключить в кавычки весь аргумент или просто часть его. Например, это работает также:
sudo rm /usr/local/bin/'Katy Perry - Dark Horse (Official) ft. Juicy J-0KSOMA3QBU0.mp4.part'
Или даже:
sudo rm /usr/local/bin/Katy' Perry - Dark Horse (Official) ft. Juicy 'J-0KSOMA3QBU0.mp4.part'
(Я выделил курсивом части вышеупомянутых команд, которые заключаются в кавычки, таким образом, эффекты '
быть видным.)
При заключении в кавычки с '
, только '
рассматривается особенно. Это всегда подбирается как заключительная метка кавычки.
Напротив, при заключении в кавычки с двойными кавычками, как широко рекомендуется (даже когда ненужный), будет обычно работать, но работает в соответствии с довольно сложными правилами.
"
Существует три общих падежа где заключение в кавычки с "
используется в предпочтении '
.
По некоторым причинам многие люди стилистически предпочитают "
. Это не обязательно неправильно или нежелательный, но я рекомендую против предпочтения "
если Вы не знакомы и довольны правилами, из которых окружают расширения, это делает и не предотвращает.
Когда Ваше выражение содержит символ одинарной кавычки ('
), это не может быть включено в одинарные кавычки, но это может быть включено в двойные кавычки. И как '
, "
заключение в кавычки удаляет особое значение из пробелов, вкладок, новые строки (разрывы строки), (
и )
, {
и }
, <
и >
, ;
, &
, |
, ?
, *
, ~
и #
. (И возможно другие символы, в зависимости от того, если я забываю что-нибудь и относительно того, какие опции оболочки включены.), Например:
du -h "Don't Ask Me Why (Eurythmics, 1989).flac"
Таким образом двойные кавычки хорошо работают для конкретного файла, который Вы удаляли - чье имя содержало специальные символы (
, )
, и пространство - и предложение для использования их в этом случае было и полезно и отлично хорошо.
Однако, в отличие от этого, '
, заключение в кавычки с "
не удаляет особое значение из $
, `
, \
, и (если расширение истории не отключено), !
. (Ни "
, который, как Вы ожидали бы, интерпретируется как заключительная двойная кавычка. Обычно.)
"
заключение в кавычки таким образом полезно, когда Вы не хотите препятствовать тому, чтобы оболочка выполнила расширения на основе значения тех символов. Например, выполнение f='fee fi fo'
сопровождаемый cat "$f fum.txt"
печатает содержание fee fi fo fum.txt
.
Но когда такое поведение является непредвиденным, оно может вызвать проблемы:
$ du -sh
...
$ rm "Stupid Scheme to Make $$$$$$ Quick!!!!.pdf"
rm "Stupid Scheme to Make $$$$$$ Quickdu -shdu -sh.pdf"
rm: cannot remove ‘Stupid Scheme to Make 453745374537 Quickdu -shdu -sh.pdf’: No such file or directory
Символы, которые сохраняют их особое значение в "
кавычки могут самостоятельно быть заключены в кавычки, будучи предшествовавшимся a \
:
$ echo "\"Windows uses '\\' as the path separator,\" screeched Multiplatform Owl wisely."
"Windows uses '\' as the path separator," screeched Multiplatform Owl wisely.
Когда неупомянутое \
предшествует символу, для которого не нужно дальнейшее заключение в кавычки, это остается неизменным. (Таким образом \\
в вышеупомянутой команде, возможно, просто был сингл \
.)
В двойных кавычках, \
прежде !
удаляет его особое значение (т.е. предотвращает расширение истории). Но в отличие от когда \
заключает другие специальные символы в кавычки, a \
прежде !
не удален. Таким образом, \!
интерпретируется как литерал \!
, тогда как \$
интерпретируется как литерал $
и \
прежде чем пространство интерпретируется как литеральное пространство.
\
\
заключает в кавычки отдельный символ, символ сразу после него. (Кроме, конечно, когда это самостоятельно заключается в кавычки.)
Для большинства символов x
, \x
эквивалентно x
. \
специфически полезно, когда символ после него имеет особое значение - это удаляет особое значение из того символа:
$ rm -v Stupid\ Scheme\ to\ Make\ \$\$\$\$\$\$\ Quick\!\!\!\!.pdf
removed ‘Stupid Scheme to Make $$$$$$ Quick!!!!.pdf’
Когда \
включается в двойные кавычки ("
), это работает по-другому, как описано выше. Это затем имеет особое значение только, когда следующий символ специален, и иначе интерпретируется буквально.
Вручную пишущие команды с \
является особенно полезным и соответствующим, когда Вы не должны использовать очень многих из них и можете быть несколько неэффективными иначе.
Например:
ek@Ilex:~$ pastebinit <<< Hello,\ world!
http://paste.ubuntu.com/8390449/
(Сингл !
символ в конце аргумента не должен быть заключен в кавычки.)
Предположим, что Вы хотели couldn't wouldn't shouldn't can't won't don't!!
появиться буквально. Простой способ достигнуть этого состоял бы в том, чтобы заключить его в кавычки как:
"couldn't wouldn't shouldn't can't won't don't"'!!'
Или (так как \
прежде !
только сбои, которые будут удалены, когда дважды заключенный в кавычки):
"couldn't wouldn't shouldn't can't won't don't"\!\!
С этим можно объединить и можно считать вариацией на, заключая в кавычки только часть аргумента, как обсуждено выше.
man bash
(иначе удар (1), страница справочника удара) Пробелы не позволяются в терминале, потому что они разделяют различные части команды. Таким образом для имен файлов с пробелами необходимо использовать цитаты, как @Cornelius сказал, или \
незадолго до каждого пространства:
sudo rm /usr/local/bin/Katy\ Perry\ -\ Dark\ Horse\ \(Official\)\ ft.\ Juicy\ J-0KSOMA3QBU0.mp4.part
, Так как некоторые редкие команды doesn’t принимают, что цитаты, you’d лучше знают [приблизительно 112].