Що відбувається
Оболонка (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.