Accidentalmente creé un archivo con el nombre -
(por ejemplo, seq 10 > -
). Luego traté de usar less
para verlo, pero simplemente se cuelga.
Yo entiendo que esto está sucediendo porque less -
la entrada espera de stdin
, por lo que no interpreta el -
nombre de un archivo. He intentado less \-
pero no funciona bien.
Así que, ¿hay alguna manera para indicar less
que -
es un archivo y no StdIn?
Lo mejor que pude conseguir es:
find -name '-' -exec less {} +
-
solo es diferente.-
no es una opinión.-
no se trata como una opción, que es un problema totalmente diferente del caso de los argumentos que pasan a tener la forma de opciones.-
entre comillas simples como'-'
o escapar\-
porque-
no es un carácter especial para shells comunes (al menos los que cumplen con POSIX). El resultado es el mismo.Respuestas:
Solo prefijalo con
./
:O use la redirección:
Tenga en cuenta que dado que
-
(a diferencia de-x
, o--foo--
por ejemplo) se considera un nombre de archivo especial en lugar de una opción, el siguiente no funciona:fuente
find -name '-' -exec less {} +
corre.-
y./-
(o/path/to/-
o../to/-
) son dos (4) caminos válidos a que-
el archivo, sino un-
argumento es especial paraless
(medios leen de la entrada estándar), mientras que./-
no es especial.find -name '-' -exec less {} +
es la forma no estándar parafind . -name '-' -exec less {} +
. Desciende el árbol.
y encuentra archivos y pasa las rutas de esos archivos como argumentos aless
. Reemplazar-exec less
con-exec echo less
ver lo que está siendo ejecutado.--
es marcar el final de las opciones. No ayudará aquí. Esa-
no es una opción, es un argumento especial sin opción. Ver también unix.stackexchange.com/a/56370 , unix.stackexchange.com/a/110756--
es manejado por getopt () para marcar el final de las opciones,-
no es reconocido como una opción por getopt (), por lo que-
será reconocido como un argumento normal si--
se proporciona o no. Y como argumento normal,less
como la mayoría de las utilidades de texto lo tratarán como un stdin que significa, que no queremos aquí.Yo solo lo haría
mv - f && less f
. Problema resuelto.fuente
Nota: mi respuesta NO es válida en el caso del OP, y solo se aplica a las herramientas que siguen la convención mencionada a continuación y no en el caso de un archivo llamado exactamente solo
-
(guión), que a menudo también es un caso especial para especificar esa lectura del estándar se espera entrada Ver la respuesta aceptada.Dejando esto aquí, ya que contiene información útil para otros casos que uno puede tropezar durante la búsqueda de respuestas.
Doble Dash it!
Use la convención estándar de doble guión (
--
) para indicar el último argumento:Ejemplo
Whhhaattt?
Este
--
argumento se deriva de un convenio con el apoyo de la mayoría de las implementaciones de utilidad de shell y herramientas de línea de comandos, y la mayoría de las cáscaras visiblemente defender que debe seguir cuando implemeing herramientas de CLI.Recomendado por el Grupo Abierto
El OpenGroup también menciona que en la descripción Utilidad de valores predeterminados de la sección (v6) de su especificación Base:
Y en la sintaxis Directrices Utilidad (v7):
Recomendado por Bash
Aquí, extraído del manual de bash, sobre sus componentes incorporados que lo respaldan:
Lectura adicional
fuente
-
el cual no es una opción. Usar./-
o redireccionar cuando sea posible es generalmente un mejor enfoque, ya que evita otros tipos de problemas como elfoo=bar
deawk
o ese-
. Ver también unix.stackexchange.com/a/56370 , unix.stackexchange.com/a/110756less -- -
aún intentará leer desde stdin.