Use java y xargs (?) Para proporcionar solo argumentos al programa java y no para reemplazar stdin


0

He escrito un pequeño programa Java que toma argumentos de la línea de comandos y debería ser interactivo.

Cuando quiero probar con una entrada grande, quiero canalizar el contenido de un archivo a la JVM para usarlo como argumentos de entrada al programa, pero no quiero reemplazar la entrada estándar con el contenido del archivo.

Así que lo intenté

menos archivo | xargs -0 java -cp ... mypackage.ClassName

pero esto reemplaza a stdin con el contenido del archivo, creo que la parte interactiva del programa que usa BufferedReader.readLine () toma su contenido del archivo.

¿Hay alguna manera de que primero pueda canalizar el contenido del archivo a la JVM y luego volver a StdIn?

Estoy corriendo Ubuntu

Ejemplo de código:

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String cmd;
while(true) {
    try {
    System.out.print(">");
    cmd = br.readLine(); //becomes null if I start the program as above

PD. Sería mejor para el programa Java trabajar con archivos, pero quiero saber si esto es posible Ds.


Esto no tiene sentido para mí. Quieres java -cp … --other-argument <contents-of-a-file> --another-argument mypackage.ClassName? ¿Así que puedes analizar la línea de comandos para ese argumento? ¿Tal vez debería darnos un ejemplo de código mínimo de su programa Java? Qué es lo que tú De Verdad necesidad de lograrlo, es decir, qué hay en este archivo y por qué no puede simplemente darle a su programa la ruta del archivo y dejar que eso abra el archivo.
slhck

@slhck En lugar de, por ejemplo, java -cp ... myclass "Argument0 Arugment1" Quiero hacer: java myclass & lt; contenidos del archivo & gt ;. Después de esto quiero que el programa se ejecute y stdin en java tome la entrada de stdin
user1443778

Puede obtener el contenido de un archivo evaluado en la línea de comandos así: java myclass "$(<some-file.txt)" - pero este es un hack muy malo y debes modificar tu programa Java para tomar un nombre de archivo como argumento.
slhck

Respuestas:


0

Primero, el regaño: una de las reglas menos conocidas de la programación de scripts de shell (e incluso el uso de shell interactivo) es no utilice

cat algún_archivo | some_command

a menos que tengas una muy buena razón para hacerlo. Oh, claro, funciona, pero es un estilo ineficiente y malo. Y seguro,

cat algún_archivo

es la forma más sencilla de mostrar un archivo en el terminal; esta bien. Y

cat opciones expediente | some_command

y

cat expediente 1 expediente 2 | some_command

están bien. Pero

cat algún_archivo | some_command

(con un solo nombre de archivo en la cat línea de comando) casi siempre se puede convertir a

some_command < algún_archivo

Y espero que no sea necesario decir eso, si

cat algún_archivo | some_command

es malo,

less algún_archivo | some_command

es probablemente peor Porque no lo dices

xargs -0 java -cp ... mypackage.ClassName < expediente

? Pero eso no resolvería tu problema.


Yo creo eso

La respuesta que estás buscando es:

xargs –a expediente  -0 java -cp ... mypackage.ClassName

Esto (o, equivalentemente, --arg-file = expediente ) dice xargs abrir expediente , no como entrada estándar , y léalo y procéselo de la manera en que normalmente manejaría la entrada estándar, pero deje la entrada estándar original solo, y haga que esté disponible para el programa ejecutado. Advertencia: no todas las versiones de xargs apoya esto

Por cierto, ¿estás esperando? expediente para ser tan grande que su contenido no pueda caber en una línea de comando, por lo que su programa deberá ejecutarse varias veces, con subconjuntos de expediente como argumentos?


Quiero usarlo para suministrar archivos grandes como entrada. Básicamente hice una mala implementación, pero luego sentí cierta curiosidad por saber cómo se puede usar (o abusar) este tipo de operaciones.
user1443778

Me preguntaba porque, si su archivo es grande, entonces la sugerencia de @ slhck de "$(<some-file.txt)" probablemente no habría funcionado.
Scott
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.