Які символи потрібно уникнути у файлах без лапок?


12

У мене є оболонка / термінал на основі браузера, який виконує команди bash, і я уникаю пробілів, але виявляється, що дужки також потрібно уникати. Які ще символи потрібно уникати для імен файлів, які не містяться в лапках?


Зовсім не ясно, що ви намагаєтеся зробити. І що автозавершення пов'язане з чим-небудь?
Michael Vehrs

@MichaelVehrs Я маю команду mv filename filename-fooв bash, які символи мені потрібні для виходу, крім пробілів і дужок?
jcubic

@MichaelVehrs видалено згадування про автозаповнення.
jcubic

В основному, всі метахарактори оболонки, такі як пробіли, глобуси оболонок, події історії. З цієї причини, ви повинні процитувати все ім'я файлу, а не рятуючись окремими символи: mv "$filename" "$newname".
Michael Vehrs

@MichaelVehrs Я знаю, що котирування вирішить проблему з уникненням, але мені потрібно використовувати ім'я файлу без лапок. У мене є емулятор терміналу, і він повинен працювати, коли користувач не використовує лапки.
jcubic

Відповіді:


22

Просте рішення полягає в тому, щоб покласти одну цитату ( ') на початку, а іншу - в кінці, і замінити кожен 'символ всередині імені на 4-символьну послідовність '\''. Усі символи втрачають своє особливе значення всередині одноцитуваного рядка, крім 'самого себе, який позначає кінець рядка. Послідовність '\''закінчується одноцитуваним буквальним словом, одразу слідує за цитатами, що цитуються одночасно, і відкриває нову літературу з одноцитуванням. Таким чином, назва файлу

This file's name has some weird characters!
Will you manage to escape them?

можна цитувати так:

somecommand 'This file'\''s name has some weird characters!
Will you manage to escape them?'

Подвійні лапки мають більш складні правила пропуску і не дозволяють вам включати знак оклику, !якщо активована підміна історії, тому я не буду їх розглядати далі.

Альтернативний підхід - захист персонажів за допомогою зворотних нахилів. Це працює для кожного персонажа, крім нових рядків; для нового рядка єдине рішення - введення його в одиничні лапки (або подвійні лапки). Якщо ви хочете мінімізувати кількість зворотних косих рисочок, щоб представити користувачеві ім'я, яке цитується, ви можете обмежити його місцями, де потрібна зворотна косої риски; однак, чим більше нахилів наклонено, тим більше ти ризикуєш забути той, який потрібен. Букви, цифри та символи, що не належать до ASCII, завжди добре. Процитуйте пробіл та розділові знаки, коли не впевнені.

З типовою оболонкою (ksh, bash або zsh) вам потрібно цитувати наступних символів хоча б за деяких обставин.

  • Пробіл (пробіл, вкладка, новий рядок - пам’ятаючи, що нові рядки не можна котирувати з зворотним нахилом).
  • ! - розширення історії.
  • " - синтаксис оболонки
  • #- початок коментарів, коли передує пробіл; zsh wildcards.
  • $ - синтаксис оболонки
  • & - синтаксис оболонки
  • ' - синтаксис оболонки
  • (- навіть в середині слова: ksh розширені глобуси (також доступні в bash і zsh); zsh wildcards.
  • )(див. ()
  • * - sh wildcard.
  • , - тільки всередині розширення дужки.
  • ; - синтаксис оболонки
  • < - синтаксис оболонки
  • = - в zsh, коли він знаходиться на початку імені файлу (розширення імені файлу при пошуку PATH).
  • > - синтаксис оболонки
  • ? - sh wildcard.
  • [ - sh wildcard.
  • \ - синтаксис оболонки
  • ] - ви можете піти, залишивши це без котирування.
  • ^- розширення історії; zsh wildcard.
  • ` - синтаксис оболонки
  • { - розширення дужки.
  • | - синтаксис оболонки
  • } - потрібно уникнути в zsh, інші снаряди більш м'які, коли немає відповідного відкриття дужки.
  • ~- розширення домашнього каталогу, коли воно знаходиться на початку імені файлу; zsh wildcard; завжди в безпеці, коли це останній персонаж.

Ще кілька символів можуть вимагати спеціального поводження:

  • -не особливий для оболонки, але коли він знаходиться на початку аргументу команди, він вказує варіант. Він не може бути захищений лапками, оскільки спеціальна обробка знаходиться в команді, а не в оболонці. Щоб захистити ім'я файлу, що починається з -, ви можете поставити ./перед ним - таким чином, це все одно той самий файл, але аргумент не починається з того, що починається -.
  • .Сам по собі не особливий, але крапки файлів *за замовчуванням виключаються з глобусів.
  • :не спеціально для оболонки, але деякі команди спеціально розбирають її, наприклад, щоб вказати на віддалений файл ( hostname:filename). Зверніться до документації команди, щоб побачити, як впоратися з файлами нами, що містять двокрапки.

¹ Якщо користувач не налаштував альтернативні символи розширення історії. Деякі снаряди це дозволяють. Це ще одна причина використання одиничних лапок, а не зворотних косих ринків.


Нові рядки, принаймні LFлише, можуть бути процитовані із зворотним нахилом у деяких оболонках.
iBug

@iBug Ні. У будь-якій ш-подібній оболонці штрих + нова лінія розширюється на порожній рядок, а не на новий рядок.
Жил "ТАК - перестань бути злим"

Це хороша відповідь, дякую. Чи є посилання на те, де ця інформація "офіційно" доступна?
slashmais

1
@slashmais Яка інформація? Синтаксис мови оболонки "офіційно" доступний у різних посібниках та технічних характеристиках, але звідти з'ясовується, які саме символи потребують цитування, де це не зовсім просто.
Жил "ТАК - перестань бути злим"

1
Я також виявив це: tecmint.com/manage-linux-filenames-with-special-characters - він не такий компактний, як ваш список, але має безліч прикладів. (by-the-by: "Яка інформація?" - це не крута відповідь, коли тема тут стосується персонажів)
slashmais
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.