Що відбувається
Оболонка (bash) бачить аргумент [a-z]
. Це шаблон підстановки ( глобус ), який відповідає будь-якій малій літери¹. Тому оболонка шукає ім'я файлу, яке відповідає цьому шаблону. Є три випадки:
- Жоден файл у поточному каталозі не має імені, яке є однією малою літерою. Тоді оболонка залишає схему підстановки незмінною і
tr
бачить аргументи -d
і [a-z]
. Це відбувається на більшості ваших машин.
- Один файл у поточному каталозі має ім'я, яке є однією малою літерою. Потім оболонка розширює шаблон до цього імені файлу і
tr
бачить аргументи -d
та ім'я файлу. Це відбувається на сервері, і відповідний файл викликається, o
оскільки ми бачимо, що tr
лист видалили o
.
- Два чи більше файлів у поточному каталозі мають ім’я, яке є однією малою літерою. Потім оболонка розширює шаблон до списку відповідних імен файлів і
tr
бачить три або більше аргументів: -d
і назви файлів. Оскільки tr
очікує єдиного аргументу після -d
, він скаржиться.
Що ви повинні були зробити
Якщо в аргументі команди є спеціальні символи, ви повинні їх уникнути. Поставте аргумент в одиничні лапки '…'
(це найпростіший спосіб, є й інші). Всередині одиничних лапок усі символи стоять за собою, крім самої однієї цитати. Якщо всередині аргументу є одна цитата, замініть її на'\''
.
tr -d '[a-z]'
Однак зауважте, що це все-таки не те, що ви мали на увазі! Це повідомляє tr
про видалення малих літер та квадратних дужок. Це еквівалентно tr -d ']a-z['
, tr '[]a-z'
і т.д. Для видалення малих літер, використання
tr -d a-z
Аргумент до tr
- це набір символів. Ви ставите дужки навколо набору символів у звичайному виразі чи шаблоні символів, щоб вказати, що це набір символів. Але tr
працює над одним персонажем за один раз. Аргументи його командного рядка - це те , що ви поставили всередині дужок .
Вам потрібні дужки для позначення класів символів . У регулярному виразі ви використовуєте дужки всередині дужок для позначення класу символів, наприклад, [[:lower:]]*
збігається з будь-якою кількістю малих літер, [[:lower:]_]*
відповідає будь-якій кількості малих літер та підкресленням. У аргументі tr
вам потрібен набір без навколишніх його дужок, тому tr -d '[:lower:]'
видаляються малі літери, tr -d '[:lower:]_'
видаляються малі літери та підкреслення тощо.
¹ У деяких регіонах він може відповідати іншим символам .
tr
діапазони записуються без додавання[...]
. Такtr -d '[a-z]'
буде вбиватиa-z
, а також персонажів[
і]
. Використовуйтеtr -d a-z
для вбивства лише літерa-z
.