Як "менше" файлу з назвою "-"?


17

Я випадково створив файл з назвою -(наприклад, seq 10 > -). Потім я спробував використати lessдля його перегляду, але він просто зависає.

Я розумію, що це відбувається, тому що less -очікує введення stdin, тому воно не інтерпретує -як ім'я файлу. Я спробував, less \-але і це не працює.

Отже, чи є спосіб вказати, lessщо -це файл, а не stdin?

Найкраще, що я міг отримати:

find -name '-' -exec less {} +

2
@muru дякую за коментар, але можливий дублікат настільки специфічний, що я не думаю, що він може бути "точним дублікатом". Якщо це було перетворено на щось більш загальне, як-от "як отримати доступ до файлу, що починається з" - "", можливо.
fedorqui

4
Це не повторне питання. Справа -поодинці буває різною. -не є варіантом.
Стефан Шазелас

1
@terdon Я не думаю, що однакова відповідь безпосередньо означає, що вони копії. Десь у Meta SO був приклад: якщо на запитання буде відповідено "Ні", чи буде дублікат думкою, правильна відповідь "Ні"? Як я вже говорив раніше, було б цікаво переформулювати кандидата дубліката, щоб він був більш загальним; інакше не має сенсу надсилати туди інші питання, подібні до цього.
fedorqui

4
@terdon, ні. Тут прийняте рішення не працюватиме. І ні, -не трактується як варіант, це зовсім інша проблема, ніж аргументи, які, мабуть, мають форму варіантів.
Стефан Шазелас

2
Не варто укладати -між окремими цитатами на зразок '-'або уникати таких, \-як -це не є особливим символом для загальних оболонок (принаймні сумісних з POSIX). Результат такий же.
пабук

Відповіді:


53

Просто додайте його до ./:

less ./-

Або скористайтеся перенаправленням:

less < -

Зауважте, що оскільки -(на відміну від -xабо, --foo--наприклад) вважається спеціальним іменем файлу, а не опцією, наступне не працює:

less -- -   # THIS DOES NOT WORK

3
До речі, ось що find -name '-' -exec less {} +працює.
Стефан Шазелас

6
@fedorqui, ні, це просто те, що -і ./-(або /path/to/-або ../to/-) є двома (4) дійсними шляхами до цього -файлу, але -аргумент є спеціальним less(означає, що читається з stdin), але ./-не є особливим.
Стефан Шазелас

2
@fedorqui find -name '-' -exec less {} +- це нестандартна форма для find . -name '-' -exec less {} +. Він опускається до дерева .та знаходить файли та передає шляхи цих файлів як аргументи less. Замініть -exec lessна, -exec echo lessщоб побачити, що запущено.
Стефан Шазелас

4
@haylem, --означає позначення кінця варіантів. Тут це не допоможе. Це -не варіант, це спеціальний необов'язковий аргумент. Дивіться також unix.stackexchange.com/a/56370 , unix.stackexchange.com/a/110756
Stéphane Chazelas

3
@haylem, спробуй сам. --обробляється getopt () для позначення кінця параметрів, -не розпізнається як варіант getopt (), тому -він буде розпізнаний як нормальний аргумент --, надається він чи ні. І як звичайний аргумент, lessяк і більшість текстових утиліт, трактують це як значення stdin, чого ми тут не хочемо.
Стефан Шазелас

3

Я б просто mv - f && less f. Проблема вирішена.


Ну, це працює, хоч це мені нагадує про витрачені мільйони NASA на розробку ручки, яка б писала у космосі, тоді як радянські космонавти використовували олівець . Я думаю, що ми можемо дозволити собі трохи інвестувати в дослідження.
fedorqui

+1 навіщо ускладнювати речі, якщо існує просте рішення.
Mhmd

3

Примітка: моя відповідь НЕ дійсна у випадку ОП, і стосується лише інструментів, що відповідають конвенції, згаданій нижче, а не у випадку файлу, названого саме просто -(тире), що часто також є спеціальним випадком для визначення цього читання зі стандартного вхід очікується. Дивіться прийняту відповідь.

Залишаючи це тут, оскільки він містить корисну інформацію для інших випадків, на які можна натрапити, шукаючи відповіді.


Двічі-Даш!

--Для позначення останнього аргументу використовуйте стандартну умову подвійного тире ( ):

less -- -FILENAME

Приклад

$ echo "meh" > -badname
$ less -badname
Number is required after -b
$ less -- -badname # GREAT SUCCESS!

Whhhaattt?

Цей --аргумент випливає з конвенції, підтримуваної більшістю реалізацій утиліт оболонок та інструментів командного рядка, і більшість оболонок помітно відстоюють, що слід дотримуватися цього під час реалізації інструментів CLI.

Рекомендовано Відкритою групою

OpenGroup також згадує про це в розділі за замовчуванням опису утиліти (v6) своєї базової специфікації:

Поведінка за замовчуванням: [...] Стандартні утиліти, які не приймають параметри, але приймають операнди, повинні визнавати "-" як перший аргумент, який слід відкинути.

Вимога розпізнавання "-" полягає в тому, що відповідні програми потребують способу захисту своїх операндів від будь-яких довільних варіантів, які реалізація може надавати як розширення. Наприклад, якщо в стандартному foo утиліті вказано, що він не має жодних параметрів, і програмі, необхідній для того, щоб дати йому ім'я шляху з провідним дефісом, він може сміливо робити це як:

foo -- -myfile

і уникати будь-яких проблем із -m, що використовується як розширення.

І в Правилах синтаксису утиліти (v7):

Настанова 10: Перший - аргумент, який не є параметром-параметром, повинен прийматися як роздільник, що вказує на кінець параметрів. Будь-які наступні аргументи слід розглядати як операнди, навіть якщо вони починаються із символу '-'.

Рекомендовано Башем

Ось витяг із посібника з bash, про його вбудовані компоненти, які його підтримують:

Якщо не зазначено інше, кожна вбудована команда, задокументована в цьому розділі, приймає варіанти, яким передує - приймає - для позначення кінця параметрів.

:, Правда, помилково, і тестові вбудовані не приймають варіанти та не розглядають - спеціально. Вихід, вихід із системи, перерва, продовження, пускання та зміщення вбудованих файлів приймають та обробляють аргументи, починаючи з - не вимагаючи -. Інші вбудовані, які приймають аргументи, але не вказані як прийняття параметрів, інтерпретують аргументи, починаючи з - як недійсні варіанти та вимагаючи - щоб запобігти цій інтерпретації.

Зауважте, що луна не трактує - означає кінець варіантів.

Додаткове читання


2
+1: Найбільш портативне та незалежне від команд рішення, яке легко запам'ятовується, і вважається "найкращою практикою"
mveroone

2
@Kwaio будь-яка посилання на "кращу практику"? Просто відчуйте цікавість з цього приводу.
fedorqui

24
Ця відповідь стосується аргументів, схожих на варіанти. Це не той випадок, для -якого це не варіант. Використання ./-або перенаправлення , коли це можливо , як правило , кращий підхід , як він уникає інших видів проблем , як foo=barз того awkчи іншого -. Дивіться також unix.stackexchange.com/a/56370 , unix.stackexchange.com/a/110756
Stéphane Chazelas

7
Як каже Стефан, це не відповідає на питання. less -- -все ще спробую прочитати з stdin.
Michał Politowski

5
Ви можете видалити відповідь (або перенести її на інше запитання, оскільки тут є корисні посилання) або дати зрозуміти, що вона не стосується даного конкретного випадку (а може пояснити, що було б ще корисніше).
Стефан Шазелас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.